C++面试题更新 2026-08-05

请阐述死锁产生的必要条件有哪些?并说明在实际系统中可以通过哪些具体手段来预防、避免或解除死锁?

技术原理方案权衡C++

考察说明

考察对死锁产生条件及常见处理策略的理解。

回答思路

  1. 【回答框架 1】死锁是指两个或多个线程或进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进。其产生的四个必要条件是:互斥、占有且等待、不可剥夺、循环等待。
  2. 【回答框架 2】预防死锁是通过破坏四个必要条件之一来实现。例如,破坏互斥条件可通过允许资源共享,但通常不可行;破坏占有且等待可要求线程一次性申请所有资源;破坏不可剥夺可允许线程抢占其他线程的资源;破坏循环等待可通过资源有序分配法,即对资源编号,线程按编号递增顺序申请资源。
  3. 【回答框架 3】避免死锁常用银行家算法,其在资源分配前判断系统是否处于安全状态,只有安全才分配资源。银行家算法的核心是检查是否存在安全序列,能有效避免死锁,但需要预先知道每个进程的最大资源需求,且计算开销较大。
  4. 【回答框架 4】解除死锁的方法包括:资源剥夺、撤销进程、进程回退等。在实际系统中,除了预防和避免,还可以采用死锁检测与恢复机制,如定期检测资源分配图,检测到死锁后采取相应措施。
  5. 【回答框架 5】此外,在并发编程中,应尽量减少锁的使用,使用更高级的并发原语如无锁数据结构、乐观锁等,并注意锁的获取顺序,以降低死锁风险。
  6. 【关键点 1】死锁的四个必要条件是互斥、占有且等待、不可剥夺、循环等待。
  7. 【关键点 2】预防死锁通过破坏四个必要条件实现。
  8. 【关键点 3】避免死锁常用银行家算法,基于安全序列判断。
  9. 【关键点 4】解除死锁可通过资源剥夺、撤销进程等。
  10. 【关键点 5】实际系统中可结合检测与恢复机制。
  11. 【易错点 1】死锁预防中的破坏互斥条件通常不可行,因为有些资源本质上是互斥的。
  12. 【易错点 2】银行家算法要求预先知道最大资源需求,且可能降低资源利用率。
  13. 【易错点 3】检测死锁的周期过长可能导致性能问题,过短则检测开销大。