我在 Anthony Williams 的书“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 编译代码有人真的尝试过并点击断言吗?谁能给我解释一下我的测试结果?顺便说一句,我也尝试了不使用原子类型的版本,我得到了相同的结果。目前,这两个程序运行良好。谢谢。