2017-11-06 12 views
2

次のコードはWikiです。他のプロセスはセマフォを使用して起動しません

wait(Semaphore s){ 
    s=s-1; 
    if (s<0) { 
     // add process to queue 
     block(); 
    } 
} 

signal(Semaphore s){ 
    s=s+1; 
    if (s>=0) { 
     // remove process p from queue 
     wakeup(p); 
    } 
} 

何容量は1(sが1に初期化される)である間、私は2つの以上のプロセスを持っている場合は?たとえば、プロセス1は重要なセッションに入ります。その後、プロセス2および3はwaitを呼び出します。 sは-2となります。次にプロセス1が終了し、signalを呼び出します。 sは-1になります。 s >= 0が満たされないため、プロセス2および3は決して目を覚まされません。ここで何が問題なの?本はリンクのwikiとは対照的に、

+0

コードが間違っている、それは 'する必要がある場合(S <= 0){ウェイクアップ(P)}' – yakout

答えて

0

https://en.wikipedia.org/wiki/Semaphore_(programming)

を見てみましょう。

wikiの記事とWindowsでは、セマフォはゼロまたは正の数を持ち、カウントに符号なしの整数を使用して実装できます。セマフォの待機関数は、セマフォが既にゼロの場合はセマフォをデクリメントせず、単に待機します。複数のプロセスまたはスレッドがcount == 0のセマフォを待っている場合、セマフォが1だけインクリメントされると、プロセスまたはスレッドのうちの1つだけが起動し(セマフォが0に戻されて減少します)、動作していますシステムに依存して、どちらが起きるかが決まります。

セマフォ機能への追加リンクを含むWindowsセマフォの説明にリンクします。

https://msdn.microsoft.com/en-us/library/windows/desktop/ms685129(v=vs.85).aspx

関連する問題