2013-02-24 79 views
0

如果在多线程应用程序没有线程在任何时候获得过任何形式的不止一个锁,这种锁总是在某个时候释放出来,是死锁可能吗?必要对死锁的充分条件发生

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

如果是这样的话,在什么时候做死锁成为可能?例如,如果除一个线程之外的所有线程永远不会获得多个锁,那么是否会造成死锁?我个人看不出如何。

经典的死锁案例是一个线程拥有锁定A的情况,但需要锁定B,而另一个线程拥有锁定B并且需要锁定A.显然,这对于死锁是足够的,但这是最低限度的必要吗?

+0

你说的意思是“任何一种形式?”您所指的锁是否有多种类型? – 2013-02-24 21:51:27

+0

可能是 - 互斥量,信号量等 - 线程阻塞控制对共享资源的访问的同步元素的任何基础。 – omatai 2013-02-24 21:58:35

回答

0

死锁可能会发生,如果一个线程锁,而另一个线程想要获得相同的锁定对象的锁,但第一个线程永远不会释放它的锁(也许是因为第一个线程在一个条件等必须设置由第二个线程,但第二个线程从不设置该条件,因为它无法获得锁)。

正如你所看到的,故意制造死锁实际上是一个很容易的事。

+0

但...如果“这种锁总是在某个时候释放”,并且不以其他线程设置的数据为条件,那么....? – omatai 2013-02-24 22:00:51

+1

然后你不会陷入僵局。当另一个线程正在等待的锁永远不会被释放时,会发生死锁。当然,棘手的部分是以保证锁始终释放的方式编写程序。 – 2013-02-24 22:13:30

1

从高级概念操作系统的提取物

以下4个条件是必要的死锁发生

1.Exclusive接入 - 资源

2.Wait而单个接入HOLD - 等待另一个资源时,你已经有一个或多个

3.No抢占 - 只释放资源的方式是流程死

4.Circular等待 - 有资源循环依赖需要

的系统很容易出现僵局,如果它满足所有上述四个条件

你提到的案件是一个请求模型,其中只有一个资源请求,因为资源在一个时间点被释放,所以没有等待和搁置。因此不存在死锁

然而在情况2对或多个资源的请求,可以有多种方式,这将导致满足所有上述条件。

你提出的例子是一个典型的循环等待案例。一种解决方案是使用层次结构,即在锁B之前获取锁A ...这将防止循环等待。

我会建议得到更多的想法阅读和请求模型,或者请求模型,Q REQUEST模型的P输出,当然还有一个请求MODEL