例如
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