x86 では bool 読み取り/書き込み操作はアトミックではないのでしょうか? [重複] 質問する

x86 では bool 読み取り/書き込み操作はアトミックではないのでしょうか? [重複] 質問する

2 つのスレッドがあり、1 つはループで bool を読み取り、もう 1 つは特定の時間にそれを切り替えることができるとします。個人的には、sizeof(bool)C++ では 1 バイトであり、バイトを部分的に読み書きすることはないため、これはアトミックであるべきだと思いますが、100% 確実にしたいと思っています。

それで、はい、それともいいえ?

編集:

また、今後の参考までに、 にも同じことが当てはまりますかint?

ベストアンサー1

C++11 の「アトミック」型が対処する 3 つの個別の問題があります。

  1. ティアリング: 読み取りまたは書き込みには複数のバス サイクルが含まれ、操作の途中でスレッドの切り替えが発生します。これにより、不正確な値が生成される可能性があります。

  2. キャッシュの一貫性: あるスレッドからの書き込みではそのプロセッサのキャッシュは更新されますが、グローバル メモリは更新されません。別のスレッドからの読み取りではグローバル メモリが読み取られ、他のプロセッサのキャッシュ内の更新された値は表示されません。

  3. コンパイラの最適化: コンパイラは、値が別のスレッドからアクセスされないという前提で読み取りと書き込みの順序を入れ替えるため、混乱が生じます。

を使用するとstd::atomic<bool>、これら 3 つの問題がすべて正しく管理されることが保証されます。 使用しないとstd::atomic<bool>、推測するしかなく、せいぜい移植性のないコードになります。

おすすめ記事