产生的必要条件

  • 互斥
  • 请求与保持
  • 不被剥夺
  • 循环等待

    一直等待请求额外互斥资源

可能发生的场景

  • 在函数嵌套调用中,多次请求同一资源

  • 不同线程中,以不同的顺序请求多个资源,而其中某个资源不足

调试与诊断方法

  1. ps查看进程PID,状态,阻塞原因

  2. gdb attach到目标进程

  3. 保存现场,防止后续调试破环

    generate-core-file
    
  4. 查看所有线程的调用栈

    thread apply all bt
    
  5. 切换到相应线程

    thread NUM
    
  6. 查看相应互斥量,持有情况(pthread_mutex_t.__owner)

    print MUTEX
    

预防

  • 打破产生死锁的4个必要条件中的任何一个
  • 利用RAII手段,确保stack mutex离开作用域时被解锁(MutexGuard, std::lock_guard)

    • 异常结束(throw)

    • 分支跳出(break, continue, return)

    • 意外退出点(exit)

留言

2016-04-12