发生死锁的必要条件与充分条件

时间:2013-02-24 21:50:02

标签: multithreading

如果多线程应用程序中的任何线程在任何给定时间都没有获得任何类型的锁,并且这些锁总是在某个时刻释放,那么死锁是否可能?

我想答案是“不” - 如果另一个线程想要一个不可用的锁,它将不会保持任何锁定阻止任何其他线程运行,并且只会阻塞直到它想要的锁变为可用 - 是吗?

如果是这种情况,死锁何时变为可能?例如,如果所有线程但一次永远不会获得多个锁,那么会造成死锁吗?我个人无法看到。

经典的死锁情况是一个线程有锁A,但是需要锁B,而另一个线程有锁B并且需要锁A.显然这对于​​死锁来说已经足够了,但是这是最小的必需吗?

2 个答案:

答案 0 :(得分:1)

  

操作系统中高级概念的摘录

     

发生死锁需要以下4个条件

     

1.独家访问 - 对资源的单一访问

     

2.等待保持 - 当您已经有一个或多个

时等待另一个资源      

3.No preemption - 释放资源的唯一方法是让进程死亡

     

4.Circular wait - 对所需资源存在循环依赖

     

如果系统满足以上四个条件,则系统容易发生死锁

您提到的情况是一个请求模型,其中只有一个资源请求,因为资源在一个时间点释放,所以没有等待和保持。因此没有死锁

然而,在2个或更多资源请求的情况下,可以有多种方式来满足所有上述条件。

您提供的示例是循环等待的典型案例。一种解决方案是使用层次结构,即在锁定B之前获取锁定A ...这将阻止循环等待。

我建议更多的想法阅读和请求模型,或请求模型,P请求模型,当然还有一个请求模型

答案 1 :(得分:0)

如果一个线程锁定,并且另一个线程想要在同一个锁对象上获取锁定,则会发生死锁,但第一个线程永远不会释放其锁定(可能是因为第一个线程正在等待必须由第二个线程,但第二个线程永远不会设置该条件,因为它无法获得锁定)。

正如您所看到的,故意制造死锁实际上非常容易。