1

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

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

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

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

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

4

1 回答 1

1

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

亚伯拉罕·西尔伯沙茨、彼得·贝​​尔·加尔文和格雷格·加涅。2008. 操作系统概念(第 7 版)。威利出版社。

说:

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

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

于 2014-05-05T14:23:58.070 回答