造成死锁的两种情况
1、对共享资源锁了2次。
while(1)
{
pthread_mutex_lock(&mutex);
printf("HELLO ");
pthread_mutex_lock(&mutex);
}
如上,锁了两次,此时现象是 输出了一遍HELLO,便不动了
分析:输出HELLO后, pthread_mutex_lock(&mutex);又要加锁,加锁的话,就要先等上一把锁解锁,否则就处于阻塞状态,而上一把锁就是他本身,他本身又没有解锁,所以就一直处于阻塞状态了。
所以,为避免这种情况,需要加锁后,访问完数据,立马解锁。
2、线程1拥有A锁,请求获得B锁,线程2拥有B锁,请求获得A锁。
分析:线程1拥有A锁,请求B锁,但是,B锁被线程2占用,所以,线程1阻塞;
同样,线程2拥有B锁,请求A锁,但是,A锁被线程1占用,所以,线程2阻塞;这样就造成了死锁。
解决方法1:首先使用trylock,避免阻塞;当不能取得所有锁的时候,放弃已经占有的锁,假设线程1,lock了A锁,然后trylockB锁,发现B锁被被占用,则线程1放弃A锁,那么,线程2在获得了B锁后,接着又可以获得A锁了,获取共享资源后,线程2释放A锁和B锁,线程1就可以获取A锁和B锁了。//当得不到所有所需资源的时候,放弃已经获得的资源,等待。
解决方法2:多个线程获取锁的顺序保持一致,即都获取A锁,再获取B锁。

293

被折叠的 条评论
为什么被折叠?



