不可观察的原子是否会同步记忆?

R..*_*R.. 9 c multithreading atomic compiler-optimization c11

通常,C11原子不仅保证了对原子对象本身的操作的原子性,而且还为访问其他(非原子)对象提供了内存同步.但是,我不清楚这种同步本身是否是一种副作用,可以在严格符合的程序中独立于原子对象观察到,或者只有在所有人都能访问执行同步的原子对象时它才有意义需要进行同步的线程.

特别是,给定的功能如:

void foo()
{
    _Atomic int x = 0;
    x++;
}
Run Code Online (Sandbox Code Playgroud)

编译器是否需要为此函数生成任何代码?或者,由于x结束的生命周期立即没有机会参与其他线程的同步,编译器能否优化整个函数?

Jen*_*edt 3

首先我们有6.2.6.1 p9

具有原子类型的对象的加载和存储是通过 memory_order_seq_cst语义完成的。

对于原子对象的其他操作也是如此。

因此,所讨论的商店具有memory_order_seq_cst语义。对于这些,7.17.3 中规定它们按总顺序排列S所有此类操作的总顺序排列。与事件处于某种排序关系的对象的所有其他修改都S受到该顺序的约束。

原子对象本身和操作可以被优化,因为该值是不可观察的。但它的效果foo()memory_order_seq_cst栅栏的效果,并且该栅栏不应该被优化掉。