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變爲可減少的數量爲止,此時它會遞減,同時信號量1變爲0.這是一個單一的全有或全無的事務。 – PSkocik