2017-04-25 2 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); 

最初は、セマフォの値は、問題は、それはすべてのプロセスがのsemop機能を実行した場合でもフリーズするということであるN.

です。私はそれが操作が原子的に実行されるという事実に関連していると思う(しかし、私はそれが何を意味するかを正確には知らない)。しかし、なぜうまくいかないのか分かりません。

コードはセマフォから1を減算し、それが最後でないか、別の方法で動作するコードである場合はプロセスをブロックしますか?

+0

セマフォー0がデクリメント可能になるまでプロセスをブロックし、その時点でデクリメントされ、同時にセマフォー1は0になります。これは1つのオール・オア・ナッシング・トランザクションです。 – PSkocik

答えて

0

機能とアルゴリズム全体がないとコードが何をするのか分かりません。 それを見て、1つのアトミックアクションで2つのアクションを適用します。セマフォから1を減算し、0を待ちます。 すべてのプロセスがフリーズするといくつかの問題が発生する可能性があります。セマフォがすべてのプロセス間で共有されているわけではなく、セマフォを開始するときにプロセスの数が間違っているか、1つのプロセスがバリアを離れると、後でセマフォが増えてバリアに戻ります。 すべてのプロセスが実際に障壁にあることを確認するためのデバッグをお勧めします。セマフォに対して何らかのアクションを実行するたびに印刷することもできます(同じコンソールが望ましい)。

アトミックアクションとは何ですか?それは実行されている間中断されないことを保証された単一の動作シーケンスである。つまり、他のプロセス/スレッドがアクションを妨害することはありません。

関連する問題