简单赋值运算符的原子性

250*_*501 6 c standards atomic language-lawyer c11

C11标准表示对于原子类型(_Atomic),前缀和后缀++以及--操作是原子的(6.5.2.4.,p2),复合赋值也是如此:op=(6.5.16.2,p3).

我还没有找到任何关于简单作业的文章=.它也是原子的吗?

让我们说E1,E2是int,但只有E1用说明符_Atomic定义.我的假设是:

E1 = E2;
Run Code Online (Sandbox Code Playgroud)

相当于:

atomic_store( &E1 , E2 );
Run Code Online (Sandbox Code Playgroud)

我的假设是正确的吗?

Isa*_*ner 4

按照Dobbs 博士文章中的示例,C11 中原子变量的简单赋值是原子的

C11 标准 (ISO/IEC 9899:2011),第 6.2.6.1/9 节内容如下:

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

除了原子性之外,使用memory_order_seq_cst语义执行的操作还具有所有线程都观察到的单一顺序(也称为顺序一致的顺序)。

如果没有_Atomic类型限定符,赋值可能是非原子的。long long在 32 位机器上分配 64 位值(例如 a )需要两个 CPU 周期。如果另一个线程读取这两个周期之间的值,它们将获得 4 个字节的旧值和 4 个字节的新值。