我正在阅读这篇文章编译时内存排序,其中说:
事实上,大多数函数调用都充当编译器屏障,无论它们是否包含自己的编译器屏障。这不包括内联函数、使用 pure 属性声明的函数以及使用链接时代码生成的情况。除了这些情况,对外部函数的调用甚至比编译器屏障更强,因为编译器不知道函数的副作用是什么。
这是一个真实的声明吗?想想这个样本——
std::atomic_bool flag = false;
int value = 0;
void th1 () { // running in thread 1
value = 1;
// use atomic & release to prevent above sentence being reordered below
flag.store(true, std::memory_order_release);
}
void th2 () { // running in thread 2
// use atomic & acquire to prevent asset(..) being reordered above
while (!flag.load(std::memory_order_acquire)) {}
assert (value == 1); // should never fail!
}
Run Code Online (Sandbox Code Playgroud)
然后我们可以删除原子但替换为函数调用 -
bool flag = false; …Run Code Online (Sandbox Code Playgroud)