0

これは、セマフォのカウントについて私が理解したことです

P1 enters critical state 
calls wait()
wait()
{
semaphore--;
if (semaphore<=0)
block;
else
execute the c.s
after execution in c.s calls signal();
}
signal()
{
semaphore++;
If(blocked process exists)
allow first process that is waiting and P1 leaves c.s
}

私が正しければ、値として 1 と 0 しか持てないバイナリ セマフォの場合はどうなるか教えてください。それともバイナリセマフォの実装がこれと違うのでしょうか?

4

1 に答える 1

1

ここでいくつかのこと:

まず、セマフォが何をするために構築されているかを理解しようとします。セマフォのような構成体は、プログラムで並行性を達成するのに役立つように構築されています。自問してみてください - あなたが達成したいことは何ですか? 同期?相互排除?両方?

その答え次第で、セマフォの使い方がガラッと変わります。セマフォの機能の基本を理解することは、バイナリ セマフォとカウンティング セマフォの違いを理解するために不可欠です。

ここでバイナリ/カウントセマフォの違いを詳細に説明しました。これは役に立ちます: https : //stackoverflow.com/a/22582997/2112500あなたは基本を理解しています。上記のコードは、セマフォ内で何が起こるかを (ある程度) 理解していることを示していますが、セマフォの使用方法を知っていることを必ずしも示しているわけではありません。

たとえば、次の疑似コードでは次のようになります。

else
execute the c.s
after execution in c.s calls signal();

あなたは待機中から信号を送っています-それはあなたが望むようにはうまくいきません.

繰り返しになり allow first process that is waiting and P1 leaves c.s ますが、セマフォがどこで終わり、スレッドでの使用が始まるかを完全に把握しているとは思いません。上記のリンクから始めることをお勧めします。次に、いくつかの単純なプログラムでセマフォを試して使用し、同期と相互排除を実現します。

于 2014-03-22T21:34:58.900 に答える