C11 Standard表示对于原子类型(_Atomic),前缀和后缀++
和--
操作are atomic(6.5.2.4。,p2),以及复合赋值:{{ 1}}(6.5.16.2,p3)。
我还没有找到关于简单作业op=
的任何内容。它也是原子的吗?
我们说E1,E2是=
,但只有E1用说明符_Atomic定义。
我的假设是:
int
相当于:
E1 = E2;
我的假设是正确的吗?
答案 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个字节的新值。