0

並行性に関する本を読むとき、著者は、セマフォは、signal()の動作方法において条件変数とは異なると言います。セマフォはsignal()の呼び出し数を追跡しますが、条件変数は追跡しません。「誰も待っていないときにpthread_cond_signalを呼び出しても効果はありません」とそれは言います。この詳細が重要なのはなぜですか(さまざまな場所で何度も繰り返されているのを見てきました)。使用法にはどのような影響がありますか?ありがとうございました

4

2 に答える 2

2

概念的には、セマフォは、ミューテックス、条件変数、およびミューテックスによって保護された整数カウンターと同等です。この例えでは、セマフォを投稿することは、ミューテックスをロックし、カウンターをインクリメントし、条件変数を通知し、ミューテックスのロックを解除することと同じです。ウェイターがいない場合でも、状態は変更されます。

この例えでは、セマフォのウェイターは次と同等のことを行っています。

  1. ミューテックスをロックします。
  2. countが正ではない間、条件変数を待ちます。
  3. カウントをデクリメントします。
  4. ミューテックスのロックを解除します。

もちろん、POSIXの特定のケースについて話している場合、セマフォには、mutex / condvar / countトリプルを使用して実装できない追加の非同期信号安全プロパティがあるため、類推は現実に完全には対応していません。

于 2012-12-11T23:47:50.890 に答える
1

つまり、条件変数が関連付けられている「条件」が必要です。条件変数を使用する方法は次のとおりです。

acquire the condition's mutex

while (!condition) {
     wait on the condition variable
}

do whatever you need to do while holding the mutex

release the mutex

同様に、条件変数に関連付けられた条件が更新されるときは常に、ミューテックスを保持しながら実行する必要があります。このように、条件変数でブロックする場合、システムが待機中のスレッドのブロックを実際に解除する準備ができるまで、条件を変更することはできません。

于 2012-12-11T23:46:58.183 に答える