我正在尝试学习C++中涉及原子变量的执行顺序,我有以下代码。
根据优先选择,我的推理如下:
从推理1/2/3中,我们可以推导出1 -> 2 -> 3 -> 4
的执行顺序,从而打破推理4;从推理1/2/4中可以推导出3 -> 4 -> 1 -> 2
的执行顺序,从而破坏推理3。
这里似乎有冲突。
int main() {
while(true) {
std::atomic<int> x, y;
x.store(10);
y.store(20);
auto f1 = [&]() {
int r1 = x.load(std::memory_order_acquire); // 1
y.store(r1, std::memory_order_release); // 2
};
auto f2 = [&]() {
int r2 = y.load(std::memory_order_acquire); // 3
x.store(r2, std::memory_order_release); // 4
};
std::thread t1(f1);
std::thread t2(f2);
t1.join();
t2.join();
printf("%d %d\n", x.load(), y.load());
}
}
-编辑--
我对为什么2必须发生在3点之前的理由:
发布于 2022-01-25 09:25:56
1在2之前发生,3在4之前发生。这部分是正确的。
但是,要使3与2“同步”(和“发生在”之后) 2,它必须成功地读取由2编写的值。
如果它不读取该值(因为它在2之前运行),那么就不会发生同步,并且不对4进行相对于1的排序。在本例中,3被称为“连贯-先有秩序” 2。
同样的情况也适用于从4读取值的1。
https://stackoverflow.com/questions/70846124
复制相似问题