死锁
产生的必要条件
- 互斥
- 请求与保持
- 不被剥夺
循环等待
一直等待请求额外互斥资源
可能发生的场景
在函数嵌套调用中,多次请求同一资源
不同线程中,以不同的顺序请求多个资源,而其中某个资源不足
调试与诊断方法
ps
查看进程PID,状态,阻塞原因gdb attach
到目标进程保存现场,防止后续调试破环
generate-core-file
查看所有线程的调用栈
thread apply all bt
切换到相应线程
thread NUM
查看相应互斥量,持有情况(
pthread_mutex_t.__owner
)print MUTEX
预防
- 打破产生死锁的4个必要条件中的任何一个
利用RAII手段,确保stack mutex离开作用域时被解锁(
MutexGuard, std::lock_guard
)异常结束(throw)
分支跳出(break, continue, return)
意外退出点(exit)