下面是代码,其中每个线程必须等待每个其他线程完成集合部分,然后等待每个人都完成关键部分。
/* rendezvous code */
mutex.wait()
count++;
mutex_signal()
if(count==n)
sem.signal()
sem.wait()
sem.signal()
mutex.wait()
count--;
mutex.signal()
if(count==0)
sem.wait()
我知道两个进程可以达到两者都看到相同的count值(0或n可能)的情况。由于这两个或多个信号可以同时发送。如何在最后一次测试中出现死锁。我似乎没有得到这个。
这是一种不稳定的信号量安排,作者实际上认为它是一个旋转门,但它是一个信号量,它应该没有死锁。
请告诉我这段代码中是怎么一个死锁的!
答案 0 :(得分:1)
我会尝试解释我看到它的方式。
所有线程但最后一个将在第一个sem.wait()等待。一旦最后一个线程到达,它将sem.signal()(因为count == n)允许其中一个等待线程(比如T1)继续。然后T1将依次执行sem.signal(),这将允许另一个线程继续。这就像连锁反应。请注意,要传递的最后一个线程也将执行一个信号,该信号将使信号量值为1。 现在如果有两个线程来看看count == 0那么将尝试执行sem.wait()。但由于信号量值为1,因此一个线程将无法通过,从而导致死锁。
答案 1 :(得分:1)
" if"语句也应该在" mutex"指定的关键部分内。信号量,否则竞争条件可能导致僵局。
即,正确的代码是
/* rendezvous code */
mutex.wait()
count++;
if(count==n)
sem.signal()
mutex.signal()
sem.wait()
sem.signal()
mutex.wait()
count--;
if(count==0)
sem.wait()
mutex.signal()