2017-04-25 55 views
0

我試圖實現一個等待N個進程繼續的聚集函數。使用System V信號燈製作聚集/屏障功能

struct sembuf operations[2]; 

operaciones[0].sem_num = 0; 
operaciones[0].sem_op = -1; // wait() or p() 

operaciones[1].sem_num = 0; 
operaciones[1].sem_op = 0; // wait until it becomes 0 

semop (this->id,operations,2); 

最初,信號量的值是N.

的問題是即使當所有進程執行的執行semop函數,它凍結。我認爲這與操作是以原子方式執行的事實有關(但我不清楚它的含義)。但我不明白爲什麼它不起作用。

是否代碼從信號量中減去1,然後阻止進程,如果它不是最後一個或代碼應該以不同的方式進行操作?

+0

您的代碼會阻止進程,直到信號量0變爲可減少的數量爲止,此時它會遞減,同時信號量1變爲0.這是一個單一的全有或全無的事務。 – PSkocik

回答

0

如果沒有整個功能和算法,很難看到代碼的功能。 通過它的外觀,你在單個原子動作中應用2個動作:從信號量中減1並等待0. 如果所有進程都凍結,可能會有幾個問題;信號量不是所有進程之間共享的,當啓動信號量或一個進程離開障礙時,您獲得了錯誤的進程數量,稍後再增加信號量並返回到障礙。 我建議進行調試,看看所有進程實際上都處於障礙之中,甚至可以在每次對信號量做出任何操作時打印(最好在同一控制檯上)。

至於什麼是原子動作,它是保證在執行時不被中斷的單個或一系列操作。這意味着沒有其他進程/線程會干擾該操作。