【问题标题】:Atomicity of the simple assignment operator简单赋值运算符的原子性
【发布时间】: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


【解决方案1】:

按照Dr Dobbs article 中的示例,C11 中原子变量的简单赋值是原子的

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

具有原子类型的对象的加载和存储是通过 memory_order_seq_cst语义。

除了原子性之外,使用memory_order_seq_cst 语义执行的操作具有所有线程都观察到的单一顺序(又名sequentially-consistent ordering)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-12
    • 2014-03-14
    • 2011-08-02
    • 2019-10-06
    • 2011-11-16
    • 1970-01-01
    • 2015-09-27
    • 2013-05-12
    相关资源
    最近更新 更多