zoukankan      html  css  js  c++  java
  • 多线程编程--心得

    概念:

     (一).临界区

      临界区用来表示一种公共资源,或者说是一种共享数据。它可以被多个线程使用,但是每一次只能有一个线程能使用它。一旦临界区被占有,那么其他的线程只能等待。

      (二).死锁(Deadlock),活锁(Livelock),饥饿(Starvation)

        死锁是表示当多个线程互相持有对方所需要的锁,并一直等待的场景。假如有2个线程 A,B。当线程A在执行的过程中持有锁A,并且向下执行程序时需要锁B,那么线程A会等待锁B的释放。这个时候,恰巧线程B持有锁B,并释放的条件的需要持有锁A,那么线程A与B 都会僵持,等待对方释放。这样的场景就产生了死锁。

        饥饿是表示,当某一个或者多个线程,由于某些原因(可能是由于优先级,或者一直在等待某个锁的释放等场景)迟迟无法获得所需要的资源的时候,就会产生饥饿。虽然线程的优先级并没法明确的功控制,但是饥饿的情况却时常发生。当然饥饿与死锁比起来,那就是饥饿在将来的某个时间肯定会被执行。

        活锁的情况恰恰与上述2中情况不同,上面2种情况是想要却不可得。偏偏活锁却是一种互相谦让的状态。可以想象一个画面,当在大街上碰到一个迎面走来的人时,你会下意识的往左或者往右避免与对方相撞,但在这个时候对方也同时的往左或者往右,恰好与你的动作匹配上,然后2人各自左右谦让,导致一直过不去的场景!!这就是活锁。由于计算机没有人类的那么灵活只会死脑筋的不停谦让,导致资源一直在双方线程内来回跳动,双方都没有持有。

      (三).原子性

        原子性是指一个操作是不可中断的,即使是在多个线程一起执行的时候,一个操作开始就不会被其他操作所干扰。

        比如有一个全局的变量 int i,现在有两个线程同时对它赋值,线程A 赋值给1, 线程B 赋值给-1。那么i的值只有2种可能,要么是1 要么是-1。线程A 与线程B 它们之间是没有干扰的,是不可被中断的,这个就是所谓的原子性。

        

  • 相关阅读:
    TCHAR转化为UTF8
    Chromium ID 计算方法
    构建之法感悟
    项目名称:上海地铁游
    统一入口的Ajax验证
    基于用户体验的服务型政府网站群建设优化方案
    新技术下的政府门户网站群建设建议
    国内CMS技术发展的外在表现形式
    JavaScript基础 BOM
    JavaScript基础 常见DOM树操作
  • 原文地址:https://www.cnblogs.com/culushitai/p/11345819.html
Copyright © 2011-2022 走看看