简单赋值运算符的原子性

6

C11标准规定,对于原子类型(_Atomic),前缀和后缀++--操作 是原子性的(6.5.2.4, p2),赋值运算符op=也是原子性的(6.5.16.2,p3)。

我没有找到任何关于简单赋值=的说明。它是否也是原子性的?

假设E1,E2都是int类型,但只有E1带有_Atomic指示符。我的假设是:

E1 = E2;

等同于:

atomic_store( &E1 , E2 );

我的假设正确吗?


2
这怎么可能不是原子的呢?在“设置”和“未设置”之间有什么状态? - user458577
3
@WernerVanBelle 这是从标准的角度来看。想象一台抽象的机器。 - 2501
5
举例来说,在使用avr-gcc编译Atmel芯片时,如果你要设置一个16位变量,首先会设置高8位字节,然后设置低8位字节。 - Ctx
1
@WernerVanBelle 说,一半的位被写入了,但另一半没有,导致出现无意义的值。 - David Schwartz
1
@MM,你能否详细阐述一下你的评论并转化为答案吗? - Jens Gustedt
显示剩余3条评论
1个回答

4
在这篇Dr Dobbs文章的示例中,C11中简单的原子变量赋值是原子的。
C11标准(ISO/IEC 9899:2011),第6.2.6.1/9节提到:

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

除了具有原子性之外,使用memory_order_seq_cst语义执行的操作具有所有线程观察到的单个排序(也称为顺序一致的排序)。
如果没有_Atomic类型限定符,分配可能不是原子的。在32位机器上分配64位值(例如long long)需要两个CPU周期。如果另一个线程在这两个周期之间读取该值,则它们将获得旧值的4个字节和新值的4个字节。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接