如何避免出现死锁

在并发程序设计中,死锁 (deadlock) 是一种十分常见的逻辑错误。通过采用正确的编程方式,死锁的发生不难避免.

 

死锁的四个必要条件

  1. 互斥(Mutual exclusion):存在这样一种资源,它在某个时刻只能被分配给一个执行绪(也称为线程)使用;
  2. 占有且等待(Hold and wait):当请求的资源已被占用从而导致执行绪阻塞时,资源占用者不但无需释放该资源,而且还可以继续请求更多资源;
  3. 不可抢占(No preemption):执行绪获得到的互斥资源不可被强行剥夺,换句话说,只有资源占用者自己才能释放资源;
  4. 环形等待(Circular wait):若干执行绪以不同的次序获取互斥资源,从而形成环形等待的局面,想象在由多个执行绪组成的环形链中,每个执行绪都在等待下一个执行绪释放它持有的资源。
    这四个条件都是死锁发生所必须的条件,只要破坏这其中的某一个条件就行了。
    另外还有:银行家算法就是个学院派的东西,我至今没看到哪个系统用这种方法预防死锁!用一句话来概括就是:理论上可

    行的东西,实践上未必可行!

    通常避免死锁类的方法,实现起来都不可行,包括单一资源和多种资源的银行家算法,以及两阶段加锁法。

你可能感兴趣的:(编程,算法)