0

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

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

如果是这样,死锁在什么时候成为可能?例如,如果除一个之外的所有线程一次都不会获得一个以上的锁,那会造成死锁吗?就个人而言,我看不出如何。

典型的死锁情况是,一个线程拥有锁 A,但需要锁 B,而另一个线程拥有锁 B 并需要锁 A。显然,这对于死锁来说已经足够了,但这是最低限度的必要条件吗?

4

2 回答 2

1

操作系统高级概念的摘录

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

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

2.Wait while hold - 当你已经拥有一个或多个资源时等待另一个资源

3.无抢占——释放资源的唯一方法是让进程死掉

4.循环等待——对所需资源存在循环依赖

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

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

但是,如果请求 2 个或更多资源,则可能有多种方法可以满足上述所有条件。

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

我建议阅读 AND REQUEST MODEL,OR REQUEST MODEL,P OUT OF Q REQUEST MODEL,当然还有 ONE REQUEST MODEL

于 2013-02-25T04:55:30.753 回答
0

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

如您所见,故意制造死锁实际上是一件很容易的事情。

于 2013-02-24T21:53:25.547 回答