AnthonyWilliamsの本「C++Concurrency」のメモリモデルで例をテストしていました
#include<atomic>
#include<thread>
#include<cassert>
std::atomic_bool x,y;
std::atomic_int z;
void write_x_then_y() {
x.store(true, std::memory_order_relaxed);
y.store(true, std::memory_order_relaxed);
}
void read_y_then_x() {
while(!y.load(std::memory_order_relaxed));
if(x.load(std::memory_order_relaxed)) {
++z;
}
}
int main() {
x = false;
y = false;
z = 0;
std::thread a(write_x_then_y);
std::thread b(read_y_then_x);
a.join();
b.join();
assert(z.load()!=0);
}
説明によると、差分変数(ここではxとy)の緩和された操作は自由に並べ替えることができます。しかし、私は問題を数日以上繰り返し実行しました。アサーション(assert(z.load()!= 0);)が発生する状況に遭遇したことはありません。デフォルトの最適化を使用し、g ++ -std = c ++ 11 -lpthread dataRaceAtomic.cppを使用してコードをコンパイルします。誰かが実際にそれを試し、アサーションをヒットしますか?誰かが私のテスト結果について説明してもらえますか?ところで、アトミックタイプを使わないバージョンも試してみましたが、同じ結果になりました。現在、両方のプログラムは正常に実行されています。ありがとう。