死锁

死锁产生条件

  • 互斥条件
  • 持有并等待条件
  • 不可剥夺条件:当线程已经持有了资源 ,在自己使用完前不能被其他线程获取
  • 环路等待条件:死锁发生时,两个线程获取资源的顺序构成了环形链

避免死锁问题的发生

使用资源有序分配法来破环环路等待条件

排查死锁工具

Linux 下可使用 pstack + gdb 来定位死锁问题。

pstack命令可以显示每个线程的栈跟踪信息(函数调用过程),只需 pstack <pid> 。定位死锁问题时可以多次执行 pstack 命令查看线程的函数调用过程,多次对比结果,确认哪几个线程一直没有变化,且是因为在等待锁,那么大概率是由于死锁问题导致的。