简单赋值运算符的原子性

时间:2016-01-19 19:07:28

标签: c standards language-lawyer atomic c11

C11 Standard表示对于原子类型(_Atomic),前缀和后缀++--操作are atomic(6.5.2.4。,p2),以及复合赋值:{{ 1}}(6.5.16.2,p3)。

我还没有找到关于简单作业op=的任何内容。它也是原子的吗?

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

int

相当于:

E1 = E2;

我的假设是正确的吗?

1 个答案:

答案 0 :(得分:3)

遵循此Dr Dobbs article中的示例, C11中原子变量的简单分配是原子的

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

  

使用原子类型的对象的加载和存储   memory_order_seq_cst语义。

除了是原子之外,使用memory_order_seq_cst语义执行的操作还有一个由所有线程(aka sequentially-consistent ordering}观察到的顺序。

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