Chinaunix首页 | 论坛 | 博客
  • 博客访问: 828909
  • 博文数量: 157
  • 博客积分: 542
  • 博客等级: 中士
  • 技术积分: 1696
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-21 20:21
文章分类
文章存档

2017年(1)

2016年(2)

2015年(6)

2014年(42)

2013年(77)

2012年(19)

2011年(10)

分类: C/C++

2013-09-06 11:09:06

这种类型产生死锁:线程1加锁互斥量A,然后加锁互斥量B,同时线程2加锁互斥量B,然后加锁互斥量A.
两个线程可能同时完成第一步,那么将出现死锁现象.

这个时候可以用两种通用方法解决:
1,固定加锁顺序:即加锁必须是先A,后B,每个线程都要如此保证。
2,如果没有固定加锁顺序,则在加锁互斥量之前,请使用pthread_mutex_trylock来试加锁,如果此时的互斥量繁忙, 既加锁不成功,则按顺序把自己加的锁依次解锁以免发生死锁。


链锁:
链锁是层次锁的一个特殊的实例,即两个锁的作用范围互相交叠,当锁住一个互斥量后,代码进入一个区域,该区域需要另一个互斥量,当锁住另一个互斥量后,第一个互斥量就不需要了,可以释放它,这种链锁在遍历树型结构或者帘表结构上比较有用。每一个节点设置一个互斥量,而不是用一个互斥量锁住整个数据结构,阻止任何并行访问。                                                            
      
阅读(469) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~