什么是死锁,产生的原因,如何避免死锁
1.什么是死锁:
两个以上的线程都在等待对方释放资源才能继续执行下去,彼此之间产生了循环依赖,这就是死锁。
2.死锁产生的条件:
(1)互斥条件:一份资源在同一时间不能被多个线程同时占用
(2)持有并等待:A在等待的同时持有了a资源,B在等待A释放a资源,A在等待的时候并不会释放a资源
(3)不可剥夺:A在执行完之前并不会主动释放持有的a资源,其他线程如果想获取a资源需等待A线程执行完成
(4)环路等待:A执行需要获取B的资源,同时B执行的时候需要获取到A已经占用了的a资源,由此构成了循环依赖
3.定位问题:
在 Linux 下,我们可以使用 pstack + gdb 工具来定位死锁问题。
pstack 命令可以显示每个线程的栈跟踪信息(函数调用过程),它的使用方式也很简单,只需要 pstack
那么,在定位死锁问题时,我们可以多次执行 pstack 命令查看线程的函数调用过程,多次对比结果,确认哪几个线程一直没有变化,且是因为在等待锁,那么大概率是由于死锁问题导致的。
可以看到,Thread 2 和 Thread 3 一直阻塞获取锁(pthread_mutex_lock)的过程,而且 pstack 多次输出信息都没有变化,那么可能大概率发生了死锁。
但是,还不能够确认这两个线程是在互相等待对方的锁的释放,因为我们看不到它们是等在哪个锁对象,于是我们可以使用 gdb 工具进一步确认。
4.避免死锁:
前面我们提到,产生死锁的四个必要条件是:互斥条件、持有并等待条件、不可剥夺条件、环路等待条件。
那么避免死锁问题就只需要破环其中一个条件就可以,最常见的并且可行的就是使用资源有序分配法,来破环环路等待条件。

浙公网安备 33010602011771号