我们总是听说死锁的必要条件之一是互斥,一次只有一个线程可以锁定。
但是,我错误地认为非互斥锁可能导致死锁?
考虑一个信号量的简单情况,它允许最多两个线程来保存它。假设我们有两个2信号量,A和B.假设我们有4个进程,进程A1,A2,B1和B2。
假设进程A1和A2各自获取信号量A,进程B1和B2获取信号量B.如果我们到达A1和A2都需要信号量B的点,并且进程B1和B2都想要信号量A,每个都不放弃他们当前的锁,会有一个死锁,因为信号量只能由两个进程持有。但是信号量允许两个进程保持它,所以它不是互斥的!
有人可以解释这是不正确的推理,还是我对互斥的解释是错误的?
答案 0 :(得分:1)
您说的是正确的,您使用计数信号量会导致死锁。 互斥条件取自
Abraham Silberschatz,Peter Baer Galvin和Greg Gagne。 “操作系统概念”(第7版)。 Wiley Publishing。
表示:
至少有一个资源必须保存在不可共享的资源中 模式;也就是说,一次只有一个进程可以使用该资源。如果另一个 进程请求该资源,请求进程必须延迟 直到资源被释放。
看似矛盾的解决方案是,当计数信号量达到值1
时,它(或它所守护的资源)实际上变得不可分,因此从众所周知的条件开始适用。
换句话说,你开始过早地检查系统了。