1

スレッドが 2 つしかなく、一方のスレッドが他方のスレッドが特定のポイントに到達するまで待機する場合、次のようにしても安全ですか。

bool wait = true;

//Thread 1:
while(wait) ;
wait = true; //re-arm the signal

//Thread 2:
/* Preform here the code that needs to complete before Thread 1 continues */
wait = false;

基本的に、一方のスレッドが書き込みのみ、もう一方のスレッドが読み取りのみの場合、問題が発生する可能性はありますか? シングルの読み取りまたは書き込みboolはアトミックであると想定しています。そうでない場合でも、ここでどのように違いが生じるかわかりません。

4

2 に答える 2

5

いいえ、うまくいきません。std::atomic<bool>代わりに使用すると機能します。

C++ のアトミックは、3 つの問題に対処します。1 つ目は、複数のバス サイクルを必要とする値の格納または読み取りの途中でスレッド スイッチが発生する可能性です。これは「引き裂き」と呼ばれます。第 2 に、2 つのスレッドが 2 つの別個のキャッシュを持つ 2 つの別個のプロセッサで実行され、一方のスレッドが他方による変更を認識しない可能性があります。これを「キャッシュの一貫性」と呼びます。第 3 に、順序が重要ではないように見えるため、コンパイラがコードを移動する可能性があります。

bool値の読み取りまたは書き込みに必要なバス サイクルはおそらく 1 つだけですが、他の 2 つの問題には対応していません。

信頼できるショートカットはありません。適切な同期を使用してください。

于 2013-04-09T21:21:22.150 に答える