【问题标题】:Necessary versus sufficient conditions for deadlocks to occur发生死锁的必要条件与充分条件
【发布时间】:2013-02-24 21:50:01
【问题描述】:

如果多线程应用程序中的任何线程在任何给定时间都不会获得超过一个任何类型的锁,并且此类锁总是在某个时间点被释放,那么死锁是否可能?

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

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

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

【问题讨论】:

  • “任何种类”是什么意思?您指的是不止一种类型的锁吗?
  • 可能是 - 互斥体、信号量等 - 线程阻塞控制对共享资源的访问的同步元素的任何基础。

标签: multithreading


【解决方案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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 但是……如果“这样的锁总是在某个时候被释放”并且不以其他线程设置的数据为条件,那么……?
    • 这样你就不会死锁了。当另一个线程正在等待的锁永远不会被释放时,就会发生死锁。当然,棘手的部分是编写程序时要保证锁总是被释放。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多