通常,C11原子不仅保证了对原子对象本身的操作的原子性,而且还为访问其他(非原子)对象提供了内存同步。但是,我不清楚这种同步本身是否是一种副作用,可以在严格符合的程序中独立于原子对象观察到,或者只有在访问执行同步的原子对象时它才有意义由需要进行同步的所有线程。
特别是,给出了如下函数:
void foo()
{
_Atomic int x = 0;
x++;
}
编译器是否需要为此函数生成任何代码?或者,由于x
的生命周期立即结束而没有机会参与其他线程的同步,编译器是否可以优化整个函数?
答案 0 :(得分:2)
首先我们有6.2.6.1 p9
使用原子类型的对象的加载和存储
memory_order_seq_cst
语义。
同样适用于原子对象的其他操作。
所以有问题的商店有memory_order_seq_cst
语义。对于这些,然后在7.17.3中说明它们出现在所有这些操作的总顺序S
中。与S
中的事件处于某种排序关系的对象的所有其他修改都受到该排序的约束。
原子对象本身和操作可以优化,因为值不可观察。但是foo()
的影响是memory_order_seq_cst
围栏的影响,并且围栏不应该被优化。