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

What does assignment mean to a C11 atomic?

例如,

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.

下仔细复制位模式的行为相同

不过,我找不到任何支持该标准的证据。原子原语的赋值和 memcpy 肯定有可能是未定义的行为。

原子原语的原语操作应该如何表现?

谢谢!

_Atomic 限定的对象的操作(atomic_int 只是一种不同的写法)保证具有顺序一致性。您会发现在每个操作数的语义部分末尾都提到了这一点。 (也许没有提及作业。)

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

也行

tmp = mc + 4;                // Arithmetic

与您的评论所声称的不符。这不是对原子对象的算术运算,而是加载后跟普通的加法。更有趣的是

mc += 4;                // Arithmetic

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