【发布时间】:2014-12-13 11:17:29
【问题描述】:
在看this谈论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 标准的哪一部分阻止了这种行为?
【问题讨论】:
-
@ParkYoung-Bae:问题是,存储和释放栅栏是否都可以通过以下循环(使用获取栅栏加载不相关的变量)?
-
@ParkYoung-Bae 另外,如果我理解正确,则必须将释放围栏放在 商店之前(如果有人愿意实施商店释放就释放围栏而言)。
标签: c++ c++11 concurrency stdatomic