2

変更が同時にThread1変更されるかどうかを気にしない場合、論理エラー以外に心配することはありますか? 次の場合、クラッシュなどの原因になりますか?Flag1Thread2Flag1

  1. Thread1同時にThread2読みFlag1ますか?
  2. Thread1読みFlag1ながら同時に書き込んでいますか?Thread2Flag1

これらの例でFlag1は、 はboolです。

4

3 に答える 3

8

C++11 メモリ モデルの規則によると、次のようになります。

  1. Thread1 と Thread2 は、Flag1 をまったく同時に読み取りますか? これは常に安全です。
  2. スレッド 1 がフラグ 1 に書き込みを行っているのと同時に、スレッド 2 がフラグ 1 を読み取っていますか? これはデータ競合です。

データ競合は未定義の動作です。正常なハードウェアでクラッシュする可能性は低いですが、未定義の動作であるため、何かが起こる可能性があります。

于 2012-05-21T00:04:28.210 に答える
2

私の知る限り、2 つのスレッドがまったく同時に同じメモリにアクセスすることはできません。

並列計算でも、これらの仮定はプロセッサによって自動的に処理されます。 http://en.wikipedia.org/wiki/Parallel_Random_Access_Machine

したがって、答えはノークラッシュです。もちろん、論理エラーが発生しますが、気にしないので:p.

于 2012-05-20T23:36:04.340 に答える
-1

フラグは としてマークする必要がありますvolatile。これにより、コンパイラが一貫性のない方法で読み取り/書き込みを最適化することがなくなります。

bool への読み取り/書き込みはアトミックであると信じています。したがって、アクセスの順序を気にしなければ、他の問題は発生しないと思います。

于 2012-05-20T23:32:51.813 に答える