这种类型产生死锁:线程1加锁互斥量A,然后加锁互斥量B,同时线程2加锁互斥量B,然后加锁互斥量A.
两个线程可能同时完成第一步,那么将出现死锁现象.
这个时候可以用两种通用方法解决:
1,固定加锁顺序:即加锁必须是先A,后B,每个线程都要如此保证。
2,如果没有固定加锁顺序,则在加锁互斥量之前,请使用pthread_mutex_trylock来试加锁,如果此时的互斥量繁忙, 既加锁不成功,则按顺序把自己加的锁依次解锁以免发生死锁。
链锁:
链锁是层次锁的一个特殊的实例,即两个锁的作用范围互相交叠,当锁住一个互斥量后,代码进入一个区域,该区域需要另一个互斥量,当锁住另一个互斥量后,第一个互斥量就不需要了,可以释放它,这种链锁在遍历树型结构或者帘表结构上比较有用。每一个节点设置一个互斥量,而不是用一个互斥量锁住整个数据结构,阻止任何并行访问。
阅读(474) | 评论(0) | 转发(0) |