c++ atomic:函数调用会充当内存屏障吗?

Jef*_*ery 6 c++ atomic memory-barriers

我正在阅读这篇文章编译时内存排序,其中说:

事实上,大多数函数调用都充当编译器屏障,无论它们是否包含自己的编译器屏障。这不包括内联函数、使用 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;
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???
}
Run Code Online (Sandbox Code Playgroud)

任何的想法?

Pet*_*ker 4

编译器屏障与内存屏障不同。编译器屏障阻止编译器移动代码穿过屏障。内存屏障(宽松地说)可防止硬件跨屏障移动读写操作。对于原子来说,两者都需要,并且还需要确保读取或写入时值不会被破坏。