简单赋值运算符的原子性
Atomicity of the simple assignment operator
C11 标准表示对于原子类型 (_Atomic)、前缀和后缀 ++
和 --
操作 are atomic (6.5.2.4.,p2),复合赋值也是如此: op=
(6.5.16.2,p3)。
我没有找到任何关于简单作业的文章 =
。它也是原子的吗?
假设 E1、E2 是 int
,但只有 E1 是使用说明符 _Atomic 定义的。
我的假设是:
E1 = E2;
相当于:
atomic_store( &E1 , E2 );
我的假设正确吗?
按照这个Dr Dobbs article中的例子,C11中原子变量的简单赋值是原子的。
C11 标准(ISO/IEC 9899:2011),第 6.2.6.1/9 节内容如下:
Loads and stores of objects with atomic types are done with
memory_order_seq_cst
semantics.
除了原子性之外,使用 memory_order_seq_cst
语义执行的操作具有所有线程(又名 sequentially-consistent ordering)观察到的单一顺序。
没有 _Atomic
类型限定符,赋值可能是 non-atomic。在 32 位机器上分配 64 位值(例如 long long
)需要两个 CPU 周期。如果另一个线程读取这两个周期之间的值,它们将获得 4 个字节的旧值和 4 个字节的新值。
C11 标准表示对于原子类型 (_Atomic)、前缀和后缀 ++
和 --
操作 are atomic (6.5.2.4.,p2),复合赋值也是如此: op=
(6.5.16.2,p3)。
我没有找到任何关于简单作业的文章 =
。它也是原子的吗?
假设 E1、E2 是 int
,但只有 E1 是使用说明符 _Atomic 定义的。
我的假设是:
E1 = E2;
相当于:
atomic_store( &E1 , E2 );
我的假设正确吗?
按照这个Dr Dobbs article中的例子,C11中原子变量的简单赋值是原子的。
C11 标准(ISO/IEC 9899:2011),第 6.2.6.1/9 节内容如下:
Loads and stores of objects with atomic types are done with
memory_order_seq_cst
semantics.
除了原子性之外,使用 memory_order_seq_cst
语义执行的操作具有所有线程(又名 sequentially-consistent ordering)观察到的单一顺序。
没有 _Atomic
类型限定符,赋值可能是 non-atomic。在 32 位机器上分配 64 位值(例如 long long
)需要两个 CPU 周期。如果另一个线程读取这两个周期之间的值,它们将获得 4 个字节的旧值和 4 个字节的新值。