如果多线程应用程序中的任何线程在任何给定时间都不会获得多个任何类型的锁,并且这些锁总是在某个时刻被释放,那么死锁是否可能?
我想答案是“否”-如果另一个线程想要一个不可用的锁,它将不会持有任何阻止任何其他线程运行的锁,并且只会阻塞,直到它想要的锁变得可用-真的吗?
如果是这样的话,什么时候会出现死锁呢?例如,如果除一个线程之外的所有线程从未同时获得一个以上的锁,这是否会造成死锁?就我个人而言,我看不出是怎么回事。
典型的死锁情况是一个线程有锁A,但需要锁B,而另一个线程有锁B,需要锁A。显然,这对于死锁来说已经足够了,但这是最低限度的需要吗?
发布于 2013-02-25 12:55:31
从操作系统高级概念中摘录的
以下4个条件是发生死锁的必要条件
1.排他性访问-对资源的单一访问
2.等待等待-当您已经拥有一个或多个资源时,等待另一个资源
3.没有抢占-释放资源的唯一方法是让进程死亡
4.循环等待-对所需资源存在循环依赖
如果系统同时满足上述四个条件,则很容易发生死锁
您提到的情况是一个请求模型,其中只有一个对资源的请求,没有等待和等待,因为资源在某个时间点被释放。因此不存在死锁。
然而,在2个或更多资源请求的情况下,可以有多种方式来满足所有上述条件。
您提供的示例是循环等待的典型案例。一种解决方案是使用层次结构,即在锁B之前获取锁A…这将防止循环等待。
我建议获得更多的想法读取和请求模型,或请求模型,P出Q请求模型,当然还有一个请求模型
发布于 2013-02-25 05:53:26
如果一个线程锁定,而另一个线程希望获得同一锁对象上的锁,但第一个线程从未释放其锁(可能是因为第一个线程正在等待必须由第二个线程设置的条件,但第二个线程从未设置该条件,因为它无法获得锁),则会发生死锁。
正如您所看到的,故意创建死锁实际上是一件很容易做的事情。
https://stackoverflow.com/questions/15057043
复制相似问题