在观看有关 LLVM 中 C++11 原子实现的讨论时,有这段代码
-- Initially --
int x = 0;
std::atomic<bool> flag1{false}, flag2{false};
-- Thread 1 --
x = 42;
flag1.store(true, std::memory_order_release);
while(!flag2.load(std::memory_order_acquire));
x = 43;
-- Thread 2 --
while(!flag1.load(std::memory_order_acquire));
printf("%d", x);
flag2.store(true, std::memory_order_release);
我认为这段代码没有数据竞争(正如演讲者所说):它永远不会打印除42
.
但是,我不确定它是否会打印42
. 我的问题是:是否允许编译器在线程 1 中的 while 循环之后重新排序存储,以便两个线程都死锁?或者 C++11 标准的哪一部分阻止了这种行为?