小编Jef*_*ery的帖子

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

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

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

c++ atomic memory-barriers

6
推荐指数
1
解决办法
695
查看次数

标签 统计

atomic ×1

c++ ×1

memory-barriers ×1