我们总是听说死锁的必要条件之一是互斥,一次只能有一个线程持有锁。
然而,我认为非互斥锁有可能导致死锁的想法是错误的吗?
考虑这样一个简单的例子,一个信号量最多允许两个线程来持有它。假设我们有两个2-信号量,A和B。假设我们有4个进程,进程A1、A2、B1和B2。
假设进程A1和A2各自抢占信号量A,进程B1和B2抢占信号量B。如果我们到达一个点,其中A1和A2都想要信号量B,而进程B1和B2都想要信号量A,并且每个进程都没有放弃当前的锁,那么就会出现死锁,因为信号量只能由两个进程持有。但是信号量允许两个进程持有它,所以它不是相互排斥的!
谁能解释一下,这是不是错误的推理,或者我对互斥的解释是错误的?
发布于 2014-05-05 22:23:58
您是对的,您所描述的场景会导致使用计数信号量的死锁。互斥条件,取自
亚伯拉罕·西尔伯沙茨,彼得·贝尔·加尔文和格雷格·加尼。2008年。操作系统概念(第7版)。威利出版公司。
说:
必须以非共享模式保存至少一个资源;即,一次只能有一个进程使用该资源。如果另一个进程请求该资源,则必须延迟请求进程,直到释放该资源。
看似矛盾的解决方案是,当计数信号量达到值1时,它(或它所保护的资源)实际上成为不可共享的,因此从那一刻起,众所周知的条件就适用了。换句话说,您开始检查系统的时间有点太早了。
https://stackoverflow.com/questions/23473819
复制相似问题