我正在阅读这篇文章《编译时的内存排序》,其中提到:
事实上,大多数函数调用都充当编译器屏障,无论它们是否包含自己的编译器屏障。这不包括内联函数、带有 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!
}
然后我们可以删除原子性,但用函数调用来替代 -
bool flag = false;
int value = 0;
void writeflag () {
flag = true;
}
void readflag () {
while (!flag) {}
}
void th1 () {
value = 1;
writeflag(); // would function call prevent reordering?
}
void th2 () {
readflag(); // would function call prevent reordering?
assert (value == 1); // would this fail???
}
有什么想法吗?
flag
。默认情况下,对bool
的操作不保证是原子性的。你需要将该标志设置为原子性。 - Arunmu