2011-02-16 31 views
2

下面是代码中,每个线程必须等待每个其他线程完成集合部分,然后等到每个人都完成了关键部分。信号量的小书

/* 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() 

我知道两个进程可以达到的情况,其中两个都看到相同的计数值(0或n可能)。由于这两个或多个信号可能同时发送。在最后一次测试中怎么会有僵局?我似乎没有得到这个。
这是一种轻微的信号量安排,作者实际上认为它是一个旋转门,但它是一个信号量,它应该没有死锁。 请告诉我这段代码是如何发生死锁的!

回答

1

我会尽力解释我看到它的方式。

除最后的所有线程都会在第一个sem.wait()处等待。一旦最后一个线程到达,它将sem.signal()(因为count == n)允许等待线程之一(比如T1)继续。然后,T1将进行一个sem.signal(),这将允许另一个线程继续。这就像一个连锁反应。请注意,最后一个要传递的线程也会执行一个将使信号量值为1的信号。 现在,如果有两个线程来查看count == 0,则会尝试执行sem.wait()。但由于信号量值为1,所以一个线程将无法通过,导致死锁。

+0

但是,即使一个线程到达点数== 0,它也将等待.Hence所有的进程将在这点上等待反正。两个线程到达或一个,这些线程将无法通过。 – aasthetic 2011-02-20 01:25:42

1

“if”语句也应该在由“互斥体”信号量指定的关键部分内,否则竞态条件可能导致死锁。

即正确的代码是

/* 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()