4

クラスの概念的な疑似コード セマフォの割り当てに取り組んでいます。

一部のプロセスがセマフォで wait() を呼び出す前に、セマフォで signal() を呼び出すことができるかどうかを知りたいです。例えば:

Shared data:
Semaphore x = 0;

Process 1:
    wait(x);
    print("I'm Process 1, and Process 2 has already printed!");
    terminate();

Process 2:
    print("I'm Process 2!");
    signal(x);
    terminate();

上記の仮定では、どのプロセスが最初に実行されるかは保証されていませんが、print ステートメントを正しい順序で実行する必要があります (プロセス 1 の前にプロセス 2)。プロセス 1 が開始されると、x で待機します。次に、プロセス 2 がその印刷を実行し、x にシグナルを送って、プロセス 1 が印刷できるようにします。

ただし、プロセス 2 が開始すると、プロセス 1 が待機する前に x に通知されます。望ましい結果は、x がプロセス 1 に対して「事前に通知」され、wait(x) ステートメントをスキップすることです。これは実際に起こることですか?それとも、誰も待機していないセマフォにシグナルを送ることができないため、何らかのエラーが発生しますか?

4

2 に答える 2

4

セマフォの wait() と signal() の定義は次のとおりです。

**wait**(Semaphore S)
{
   while S<=0
     ; //no operation
   S--;
}
**signal**(S)
{
   S++;
}

あなたのコードでは、セマフォはゼロ (セマフォ x = 0) で初期化されています。待機しようとすると、wait の定義からわかるように、そのプロセスはブロックされます。 2番目のプロセス。

2 番目のプロセスが最初に (signal()) を実行すると、セマフォの値が 1 増加するため、これを待機しているプロセスは待機せずに続行できます (つまり、プロセス 2 は wait() を取得してすぐに続行します)。

于 2013-02-27T07:31:40.690 に答える
0

これによると、取得する必要はありません。コードを正しく構造化するのはプログラマーの仕事だと思います。この場合、2 番目のプロセスでセマフォを待機しないため、暴走する可能性があります。

于 2013-02-22T02:13:16.167 に答える