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);
最初は、セマフォの値は、問題は、それはすべてのプロセスがのsemop機能を実行した場合でもフリーズするということであるN.
です。私はそれが操作が原子的に実行されるという事実に関連していると思う(しかし、私はそれが何を意味するかを正確には知らない)。しかし、なぜうまくいかないのか分かりません。
コードはセマフォから1を減算し、それが最後でないか、別の方法で動作するコードである場合はプロセスをブロックしますか?
セマフォー0がデクリメント可能になるまでプロセスをブロックし、その時点でデクリメントされ、同時にセマフォー1は0になります。これは1つのオール・オア・ナッシング・トランザクションです。 – PSkocik