4

这个答案中,bdonlan 声明代码类似于以下内容:

int t;
volatile int a, b;

t = x;
a = t;
b = t;

编译器可以将其转换为:

a = x;
b = x;

我的问题是,如果x是具有松弛负载的原子变量,这是否仍然允许,如下所示?

atomic<int> x;

int t;
volatile int a, b;

t = x.load(std::memory_order_relaxed);
a = t;
b = t;
assert(a == b);    // Will this hold?

正如标题所说,是否允许 C++11 编译器引入额外的原子变量负载?额外的商店呢?

4

1 回答 1

2

编译器可以在 as-if 规则下做任何事情,但是要加载相同的内存位置两次,编译器必须表明没有其他线程可以访问相同的变量。a==b无论哪种方式,您都可以在您的示例中保证这一点。

于 2013-08-26T20:07:10.377 回答