C ++ 11编译器是否允许引入额外的原子变量?

时间:2013-08-26 05:05:24

标签: multithreading c++11 memory-model

this answer中,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编译器是否允许引入额外的原子变量?其他商店怎么样?

1 个答案:

答案 0 :(得分:2)

允许编译器在as-if规则下执行任何操作,但是为了两次加载相同的内存位置,编译器必须显示没有其他线程可以访问同一个变量。无论哪种方式,您都可以保证在您的示例中a==b