2

以下は、各スレッドが他のスレッドがランデブー部分を完了するまで待機し、全員がクリティカル セクションを完了するまで待機する必要があるコードです。

/* rendezvous code */
mutex.wait()
count++;
mutex_signal()
if(count==n)
            sem.signal()
sem.wait()
sem.signal()

mutex.wait()
          count--;
mutex.signal()

if(count==0)
         sem.wait()

2 つのプロセスが同じカウント値 (0 または n の可能性がある) を参照するケースに到達する可能性があることを私は知っています。このため、2 つ以上の信号が同時に送信される場合があります。最後のテストでデッドロックが発生する可能性があります。私はこれを理解していないようです。
これは回転式のセマフォ配置であり、作者は実際には回転式改札口であると考えていますが、これはセマフォであり、デッドロックなしで動作するはずです。このコードにデッドロックがある理由を教えてください!

4

2 に答える 2

1

私の見方で説明しようと思います。

最後のスレッドを除くすべてのスレッドが来て、最初の sem.wait() で待機します。最後のスレッドが到着すると、sem.signal() (count==n のため) が実行され、待機中のスレッドの 1 つ (T1 など) が続行できるようになります。次に、T1 が sem.signal() を実行し、別のスレッドが続行できるようにします。連鎖反応のようなものです。最後に渡すスレッドも、セマフォ値を 1 にするシグナルを実行することに注意してください。ここで、2 つのスレッドが来て、count==0 であることを確認すると、sem.wait() を実行しようとします。しかし、セマフォの値が 1 であるため、1 つのスレッドが通過できず、デッドロックが発生します。

于 2011-02-16T09:51:57.637 に答える
1

「if」ステートメントも、「mutex」セマフォによって指定されたクリティカル セクション内にある必要があります。そうしないと、競合状態によってデッドロックが発生する可能性があります。

つまり、正しいコードは

/* rendezvous code */
mutex.wait()
count++;
if(count==n)
        sem.signal()
mutex.signal()

sem.wait()
sem.signal()

mutex.wait()
      count--;
if(count==0)
     sem.wait()
mutex.signal()
于 2015-10-19T12:57:00.700 に答える