赋值对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节,它说了很多关于内存模型和定义的函数(init, store, load等),但没有说任何关于通常的操作(+,=等)。

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

我愿意相信赋值的行为与原子加载相同,然后使用memory_order_seq_cst存储。

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

我找不到任何支持标准的证据。原子原语的赋值和记忆绝对有可能是未定义的行为。

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

谢谢!

对符合_Atomic条件的对象(atomic_int只是对其的另一种写法)的操作保证具有顺序一致性。您可以在每个操作数的语义部分的末尾找到这一点。(也许没有提到赋值)

你的代码有两个地方是不正确的:初始化必须使用ATOMIC_VAR_INIT宏(7.17.2.1),memcpy是未定义的(大小可能不一致),尽管它可能会在大多数体系结构上工作。

还有

tmp = mc + 4;                // Arithmetic

不符合你的评论要求。这不是原子对象上的算术运算,而是加载后进行普通的加法运算。更有趣的是

mc += 4;                // Arithmetic

相关内容

  • 没有找到相关文章

最新更新