• 黄晓海的专栏作者中国国家地理网 2019-07-11
  • 合唱凝聚力量 文化引领发展 2019-06-27
  • 魏占军的专栏作者中国国家地理网 2019-06-26
  • 从朝美的对话和双方表现的诚意来看,形势正向好的方向发展。这应了中国那句解铃还需系铃人的老话,只有当事国之间的直接对话才能真正解决问题,其它都是弯路。 2019-06-21
  • 这是全国精气最为集中的地方 被称为中国丹田所在 ——凤凰网房产 2019-06-21
  • 屠呦呦,袁隆平都不是清华大学毕业,他们的科学贡献远大于清华大学毕业生。不要迷信名牌大学,要相信自己的努力。 2019-06-20
  • 深圳晚报总编辑丁时照祝贺人民日报创刊70周年 2019-06-15
  • 《北京市交通委员会 北京市环境保护局 北京市公安局公安交通管理局关于对部分载客汽车采取交通管理措施的通告》解读 2019-06-02
  • 2016环球医院院长领导力闭门会议在京举行 2019-06-02
  • 恩施一疯狗两天咬伤四村23人 警方出动将其击毙 2019-05-19
  • 足球王国群星璀璨 能否登顶第六冠 2019-05-19
  • 习近平倡议共为上合美好明天干杯! 2019-05-10
  • 爱这个世界——“凤凰好书榜6月榜”发布 2019-05-01
  • 美国在强化国内的经济发展,贸易战只有美国改变的战略方向才会停止,不然就会面对一切有损国家利益的项目打贸易战 2019-05-01
  • ECCO2016春夏流行趋势一览 让你的春天炫出彩虹 2019-04-30
  • 浙江十一选五结果:17、Java并发性和多线程

    浙江体彩网20选5  发布时间:2019-07-10 14:06:03

    浙江体彩网20选5 www.xwlxr.com 本文关键词:多线程死锁的例子

    多线程死锁的例子_c# 线程死锁_linux 线程死锁

    在有些情况下死锁是可以避免的。本文将展示三种用于避免死锁的技术:

    加锁顺序

    当多个线程需要相同的一些锁,但是按照不同的顺序加锁,死锁就很容易发生。

    如果能确保所有的线程都是按照相同的顺序获得锁,那么死锁就不会发生??聪旅嬲飧隼樱?/p>

    Thread 1:
      lock A 
      lock B
    Thread 2:
       wait for A
       lock C (when A locked)
    Thread 3:
       wait for A
       wait for B
       wait for C

    c# 线程死锁_多线程死锁的例子_linux 线程死锁

    如果一个线程(比如线程3)需要一些锁,那么它必须按照确定的顺序获取锁。它只有获得了从顺序上排在前面的锁之后,才能获取后面的锁。

    例如,线程2和线程3只有在获取了锁A之后才能尝试获取锁C(译者注:获取锁A是获取锁C的必要条件)。因为线程1已经拥有了锁A多线程死锁的例子,所以线程2和3需要一直等到锁A被释放。然后在它们尝试对B或C加锁之前多线程死锁的例子,必须成功地对A加了锁。

    按照顺序加锁是一种有效的死锁预防机制。但是,这种方式需要你事先知道所有可能会用到的锁(译者注:并对这些锁做适当的排序),但总有些时候是无法预知的。

    加锁时限

    另外一个可以避免死锁的方法是在尝试获取锁的时候加一个超时时间,这也就意味着在尝试获取锁的过程中若超过了这个时限该线程则放弃对该锁请求。若一个线程没有在给定的时限内成功获得所有需要的锁,则会进行回退并释放所有已经获得的锁,然后等待一段随机的时间再重试。这段随机的等待时间让其它线程有机会尝试获取相同的这些锁,并且让该应用在没有获得锁的时候可以继续运行(译者注:加锁超时后可以先继续运行干点其它事情,再回头来重复之前加锁的逻辑)。

    c# 线程死锁_linux 线程死锁_多线程死锁的例子

    以下是一个例子,展示了两个线程以不同的顺序尝试获取相同的两个锁,在发生超时后回退并重试的场景:

    Thread 1 locks A
    Thread 2 locks B
    Thread 1 attempts to lock B but is blocked
    Thread 2 attempts to lock A but is blocked
    Thread 1's lock attempt on B times out
    Thread 1 backs up and releases A as well
    Thread 1 waits randomly (e.g. 257 millis) before retrying.
    Thread 2's lock attempt on A times out
    Thread 2 backs up and releases B as well
    Thread 2 waits randomly (e.g. 43 millis) before retrying.

    在上面的例子中,线程2比线程1早200毫秒进行重试加锁,因此它可以先成功地获取到两个锁。这时,线程1尝试获取锁A并且处于等待状态。当线程2结束时,线程1也可以顺利的获得这两个锁(除非线程2或者其它线程程1成功获得两个锁之前又获得其中的一些锁)。

    需要注意的是,由于存在锁的超时,所以我们不能认为这种场景就一定是出现了死锁。也可能是因为获得了锁的线程(导致其它线程超时)需要很长的时间去完成它的任务。

    此外,如果有非常多的线程同一时间去竞争同一批资源,就算有超时和回退机制,还是可能会导致这些线程重复地尝试但却始终得不到锁。如果只有两个线程,并且重试的超时时间设定为0到500毫秒之间,这种现象可能不会发生,但是如果是10个或20个线程情况就不同了。因为这些线程等待相等的重试时间的概率就高的多(或者非常接近以至于会出现问题)。

    多线程死锁的例子_c# 线程死锁_linux 线程死锁

    (译者注:超时和重试机制是为了避免在同一时间出现的竞争,但是当线程很多时,其中两个或多个线程的超时时间一样或者接近的可能性就会很大,因此就算出现竞争而导致超时后,由于超时时间一样,它们又会同时开始重试,导致新一轮的竞争,带来了新的问题。)

    表 4–2 互斥锁范围比较 solaris posix 定义 usync_processpthread_process_shared 用于同步该进程和其他进程中的线程 usync_process_robust 无posix 等效项 用于在进程间可靠地同步线程 usync_thread pthread_process_private用于仅同步该进程中的线程。所以你可以定义一个对象,然后让同步块的锁指向整个对象来缩同步块的锁影响范围。synchronizedmethdcachingfactorizer例子锁虽然解决了安全性问题,但是引入了并发性问题,这个并发性是极差的,现在通过缩同步锁范围来保证安全的同时尽可能的提高并发性能。

    死锁检测

    死锁检测是一个更好的死锁预防机制,它主要是针对那些不可能实现按序加锁并且锁超时也不可行的场景。

    记录锁:记录锁可以简单的理解成在文件中使用读写锁,它可以保证可以有多个线程(进程)读文件,只有1个线程(进程)写文件,而同时要求读者和写者都拥有文件。而spin lock(自旋锁)则不然,它属于busy-waiting类型的锁,如果线程a是使用pthread_spin_lock操作去请求锁,那么线程a就会一直在core0上进行忙等待并不停的进行锁请求,直到得到这个锁为止。而spin lock则不然,它属于busy-waiting类型的锁,如果线程a是使用pthread_spin_lock操作去请求锁,那么线程a就会一直在 core0上进行忙等待并不停的进行锁请求,直到得到这个锁为止。

    linux 线程死锁_c# 线程死锁_多线程死锁的例子

    当一个线程请求锁失败时,这个线程可以遍历锁的关系图看看是否有死锁发生。例如,线程A请求锁7,但是锁7这个时候被线程B持有,这时线程A就可以检查一下线程B是否已经请求了线程A当前所持有的锁。如果线程B确实有这样的请求,那么就是发生了死锁(线程A拥有锁1,请求锁7;线程B拥有锁7,请求锁1)。

    当然,死锁一般要比两个线程互相持有对方的锁这种情况要复杂的多。线程A等待线程B,线程B等待线程C,线程C等待线程D,线程D又在等待线程A。线程A为了检测死锁,它需要递进地检测所有被B请求的锁。从线程B所请求的锁开始,线程A找到了线程C,然后又找到了线程D,发现线程D请求的锁被线程A自己持有着。这是它就知道发生了死锁。

    下面是一幅关于四个线程(A,B,C和D)之间锁占有和请求的关系图。像这样的数据结构就可以被用来检测死锁。

    那么当检测出死锁时,这些线程该做些什么呢?

    一个可行的做法是释放所有锁,回退,并且等待一段随机的时间后重试。这个和简单的加锁超时类似,不一样的是只有死锁已经发生了才回退,而不会是因为加锁的请求超时了。虽然有回退和等待,但是如果有大量的线程竞争同一批锁,它们还是会重复地死锁(编者注:原因同超时类似,不能从根本上减轻竞争)。

    如果更高优先级的线程因 thrd1所拥有的一个或多个互斥锁而被阻塞,而这些互斥锁是用 pthread_prio_inherit 初始化的,则 thrd1将以高于它的优先级或者所有正在等待这些互斥锁(这些互斥锁是 thrd1 指所拥有的互斥锁)的线程的最高优先级运行。2)synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生。表 4–1 互斥锁属性例程 操作 相关函数说明 初始化互斥锁属性对象 pthread_mutexattr_init 语法销毁互斥锁属性对象 pthread_mutexattr_destroy 语法 设置互斥锁范围pthread_mutexattr_setpshared 语法 获取互斥锁范围pthread_mutexattr_getpshared 语法 设置互斥锁的类型属性pthread_mutexattr_settype 语法 获取互斥锁的类型属性 pthread_mutexattr_gettype语法 设置互斥锁属性的协议 pthread_mutexattr_setprotocol 语法 获取互斥锁属性的协议pthread_mutexattr_getprotocol 语法 设置互斥锁属性的优先级上限pthread_mutexattr_setprioceiling 语法 获取互斥锁属性的优先级上限pthread_mutexattr_getprioceiling 语法 设置互斥锁的优先级上限pthread_mutex_setprioceiling 语法 获取互斥锁的优先级上限pthread_mutex_getprioceiling 语法 设置互斥锁的强健属性pthread_mutexattr_setrobust_np 语法 获取互斥锁的强健属性pthread_mutexattr_getrobust_np 语法 表 4–2 中显示了在定义互斥范围时 solaris 线程和posix 线程之间的差异。

    本文来自互联网,由机器人自动采编,文章内容不代表本站观点,请读者自行辨别信息真伪,如有发现不适内容,请及时联系站长处理。

      相关阅读
    • 黄晓海的专栏作者中国国家地理网 2019-07-11
    • 合唱凝聚力量 文化引领发展 2019-06-27
    • 魏占军的专栏作者中国国家地理网 2019-06-26
    • 从朝美的对话和双方表现的诚意来看,形势正向好的方向发展。这应了中国那句解铃还需系铃人的老话,只有当事国之间的直接对话才能真正解决问题,其它都是弯路。 2019-06-21
    • 这是全国精气最为集中的地方 被称为中国丹田所在 ——凤凰网房产 2019-06-21
    • 屠呦呦,袁隆平都不是清华大学毕业,他们的科学贡献远大于清华大学毕业生。不要迷信名牌大学,要相信自己的努力。 2019-06-20
    • 深圳晚报总编辑丁时照祝贺人民日报创刊70周年 2019-06-15
    • 《北京市交通委员会 北京市环境保护局 北京市公安局公安交通管理局关于对部分载客汽车采取交通管理措施的通告》解读 2019-06-02
    • 2016环球医院院长领导力闭门会议在京举行 2019-06-02
    • 恩施一疯狗两天咬伤四村23人 警方出动将其击毙 2019-05-19
    • 足球王国群星璀璨 能否登顶第六冠 2019-05-19
    • 习近平倡议共为上合美好明天干杯! 2019-05-10
    • 爱这个世界——“凤凰好书榜6月榜”发布 2019-05-01
    • 美国在强化国内的经济发展,贸易战只有美国改变的战略方向才会停止,不然就会面对一切有损国家利益的项目打贸易战 2019-05-01
    • ECCO2016春夏流行趋势一览 让你的春天炫出彩虹 2019-04-30
    • 辽宁快乐12选五走势图表 足彩不赚钱 德州扑克视频大赛视频 生肖码报特码诗138期 福彩3d 内蒙古十一选五6月30日 jj581通比牛牛 澳洲幸运8官网 曾氏原创二肖中特 宁夏11选5走势图爱彩乐 麻将桌吸烟机 2019颜值高的篮球鞋 双色球2019134期预测 浙江体彩中奖玩法 pc28am在线开