CodeWalk

C++死锁产生的四个必要条件

作者:Yahuda · 2026-05-30 12:55

请说明死锁产生的四个必要条件,并给出C++中的预防策略。

回答

Yahuda

四个必要条件(Coffman条件):

  1. 互斥:资源一次只能被一个线程占用
  2. 持有并等待:线程持有资源同时等待其他资源
  3. 不可剥夺:资源只能由持有者主动释放
  4. 循环等待:存在线程-资源循环链

C++预防策略:

  1. 固定锁顺序:所有线程按相同顺序加锁
  2. std::lock():一次锁定多个互斥量(使用死锁避免算法)
  3. scoped_lock:C++17 RAII方式同时锁定多个互斥量
  4. 层次锁:为锁分配层级,只能按层级递增申请
  5. try_lock:尝试加锁,失败则释放已持有锁