赋值对C11原子意味着什么?

时间:2016-07-04 15:58:01

标签: atomic c11

例如,

atomic_int test(void)
{
  atomic_int tmp = ATOMIC_VAR_INIT(14);
  tmp = 47;                    // Looks like atomic_store
  atomic_int mc;               // Probably just uninitialised data
  memcpy(&mc,&tmp,sizeof(mc)); // Probably equivalent to a copy
  tmp = mc + 4;                // Arithmetic
  return tmp;                  // A copy - perhaps load then store
}

Clang对这一切感到满意。我已经阅读了标准的第7.17节,它说了很多关于内存模型和定义的函数(初始化,存储,加载等),但没有说明通常的操作(+,=等) )。

同样令人感兴趣的是将struct wot { atomic_int value; }传递给函数的行为。

我想相信赋值行为与原子载荷相同,然后使用memory_order_seq_cst进行存储。

更乐观的是,我想相信结构赋值,传递给函数,从函数返回甚至memcpy也与在memory_order_seq_cst下仔细复制位模式的行为相同。

我无法找到任何支持证据来证明对标准的信任。绝对有可能原子原语的赋值和memcpy是未定义的行为。

原子基元的原始操作应如何表现?

谢谢!

1 个答案:

答案 0 :(得分:3)

_Atomic限定的对象(和atomic_int只是另一种写法)的操作保证具有顺序一致性。您会在语义部分的末尾提到每个操作数。 (也许缺少对作业的提及。)

您的代码在两个地方不正确:初始化必须使用ATOMIC_VAR_INIT宏(7.17.2.1),并且memcpy未定义(大小可能不一致),尽管它可能会起作用大多数架构。

也是行

tmp = mc + 4;                // Arithmetic

没有做您的评论所声称的内容。这不是原子对象的算术,而是普通加法后的加载。更有趣的是

mc += 4;                // Arithmetic

这是一个具有顺序一致性的原子操作。