【发布时间】:2016-04-25 09:52:18
【问题描述】:
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 );
我的假设正确吗?
【问题讨论】:
-
这不是怎么可能是原子的。 'set' 和 'not set' 之间是什么状态?
-
@WernerVanBelle 这是从标准的角度来看的。想象一台抽象机器。
-
@WernerVanBelle 在 Atmel 上使用 avr-gcc,例如,当您设置一个 16 位变量时,首先设置高字节,然后设置低字节。
-
我怀疑这种情况已被 6.2.6.1/9 所涵盖,“原子类型的对象的加载和存储是使用
memory_order_seq_cst语义完成的。” .++和复合赋值的情况需要特殊处理,因为涉及到同一个原子的读取和写入 -
@WernerVanBelle 说,一半的位被写入但另一半没有,给出一个无意义的值。
标签: c standards language-lawyer atomic c11