C++死锁产生的四个必要条件
请说明死锁产生的四个必要条件,并给出C++中的预防策略。
回答
Yahuda
四个必要条件(Coffman条件):
- 互斥:资源一次只能被一个线程占用
- 持有并等待:线程持有资源同时等待其他资源
- 不可剥夺:资源只能由持有者主动释放
- 循环等待:存在线程-资源循环链
C++预防策略:
- 固定锁顺序:所有线程按相同顺序加锁
- std::lock():一次锁定多个互斥量(使用死锁避免算法)
- scoped_lock:C++17 RAII方式同时锁定多个互斥量
- 层次锁:为锁分配层级,只能按层级递增申请
- try_lock:尝试加锁,失败则释放已持有锁