【问题标题】:Deadlock possible without mutual exclusion?没有互斥的死锁可能吗?
【发布时间】:2014-05-05 13:32:53
【问题描述】:

我们总是听说死锁的必要条件之一是互斥,一次只能有一个线程持有锁。

但是,我认为非互斥锁可能导致死锁是不是错了?

考虑一个信号量的简单情况,它允许最多两个线程来保存它。假设我们有两个 2 信号量,A 和 B。假设我们有 4 个进程,进程 A1、A2、B1 和 B2。

假设进程 A1 和 A2 各自抢信号量 A,进程 B1 和 B2 抢信号量 B。如果我们达到 A1 和 A2 都想要信号量 B,而进程 B1 和 B2 都想要信号量 A,每个都没有放弃他们当前的锁,就会出现死锁,因为信号量只能由两个进程持有。但是信号量允许两个进程持有它,所以它不是互斥的!

有人可以解释这是不是错误的推理,还是我对互斥的解释是错误的?

【问题讨论】:

  • 信号量死锁当然是可能的,是的。
  • 您描述的情况可能导致死锁是正确的。您对互斥的解释没有错,但是您关于死锁需要互斥的断言错误的。您只需要某种类型的排除。

标签: multithreading deadlock computer-science-theory


【解决方案1】:

您描述的场景使用计数信号量导致死锁是对的。 互斥条件,取自

Abraham Silberschatz、Peter Baer Galvin 和 Greg Gagne。 2008. 操作系统概念(第 7 版)。威利出版社。

说:

至少一个资源必须保存在不可共享的 模式;也就是说,一次只有一个进程可以使用该资源。如果另一个 进程请求该资源,请求进程必须延迟 直到资源被释放。

看似矛盾的解决方案是,当计数信号量达到值1 时,它(或它所保护的资源)实际上变得不可共享,因此从那一刻起,众所周知的条件适用。 换句话说,你开始检查系统有点太早了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-26
    • 2017-07-31
    • 2012-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-10
    相关资源
    最近更新 更多