2016-09-22 12 views
3

条件変数の以下の単純な例で考えてみましょう:条件変数とロックを使用して

bool pause = true; 

boost::mutex::scoped_lock lock(m_mutex); 
while (!pause) cv.wait(lock); 

boost::mutex::scoped_lock lock(m_mutex); 
pause = false; 
cv.notify_one(); 

たちが実行している場合、我々は基本的に、ここに scoped_lockまたは他のロックが必要ですがバイト単位の更新をサポートするプロセッサ上のコード。これは、本質的に、boolの割り当てがアトミックであることを意味します。これはx86プロセッサの場合によく見られます。

2つのスレッドが2つの異なるプロセッサ上で実行されており、別々のキャッシュを持っている場合に、変数の同期化と関係がありますか?

+0

'(中断)cv.wait(ロック);'書き込むことができます 'cv.wait(ロック、[&] {戻りポーズ;}); ' – Jarod42

+0

示されたコードは正しいです、' pause'は保護されています現在のロックで。あなたはロックガードを取り外すことができるかどうか尋ねますか? – Jarod42

+0

はい、コードは本当に正しいです。私の質問は、ロックガードが必要なのか? – user3286661

答えて

2

はい、あなたは原子を使っています。

効率を上げるためのCVを偽って見ることができます。これらの偽の検索(または同様の問題)により、書き込みが失われる可能性があります。

偽の起床を想像してみてください。受信スレッドはブールをチェックし、何も見ない(false)、次にプリエンプトされます。誰かがすべてのことを知らせ、ブールをセットする。受信スレッドはすでに処理中であるため、通知は破棄されます。受信スレッドが完了し、メッセージが失われます。

ここで、boolが設定された後、cv通知の前にシーケンスされた時間が重なる送信者にロックを追加します。このコミュニケーションホールはもう存在しません。

(でもスプリアスウェイクアップせずに、複数の通知が時々同様の問題を引き起こす可能性があります。)

あなたは通知しながら、ロックを保持する必要はありません(実際には、これはpessimizationである)が、ロックがポストを開催しなければなりません通常は一定期間書込みと事前通知を行います。

+0

「ある時代」とはどういう意味ですか?その期間を誰が決定しますか? – user3286661

+0

@user "boolが設定された後、cv通知の前にある時間が重なる送信者のロック" – Yakk

+0

通知する前にロックを解除すると、「ある程度の期間」で十分でない場合でも、受信スレッドがメッセージを紛失することがあります。 – user3286661

関連する問題