C++-死锁

概念

死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞现象,若无外力作用,它们都将无法推进下去,此时称系统处于死锁态或系统产生了死锁,这些永远在互相等待的进程称为死锁

产生原因

1. 竞争不可抢占资源引起死锁

都在等待对方占有的不可抢占的资源

2. 竞争可消耗资源引起死锁

有p1,p2,p3 三个进程,p1向p2发送消息并接受p3消息,p2向p3发送消息并接受p1消息,p3向p1发送消息并接受p2消息,如果设置是先接收消息再发送消息,则所有的消息都不能发送,这就造成死锁

3. 进程推进顺序不当引起死锁

有进程p1,p2,都需要资源A,B,当p1,p2同时运行时,p1先锁A再阻塞等待B,p2先锁B再阻塞等待A,这样也会造成互相抢占资源的死锁

必要条件

  • 互斥条件:某资源只能被一个进程使用,其它进程请求该资源时,只能等待 ,直到资源使用完毕后释放资源
  • 请求和保持条件:程序己经保持了至少一个资源,但是又提出了新的要求,而这个资源被其它进程占用, 自己占用资源却保持不放
  • 不可抢占条件:进程己获得的资源没有使用完,不能被抢占
  • 循环等待条件:必然存在一个循环链

处理思路

  • 预防死锁:破坏死锁的四个必要条件中的一个或多个来预防死锁
  • 避免死锁:和预防死锁的区别是,在资源动态分配过程中,用某种方式防止系统进入不安全状态
  • 检测死锁:运行时出现死锁,能及时发现死锁,把程序解脱出来
  • 解除死锁:发生死锁时后,解脱程序,通常是撤销进程,回收资源,再分配给正处于阻塞状态的进程