2011-02-16 27 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()