例如,
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是未定义的行为。
原子基元的原始操作应如何表现?
谢谢!
答案 0 :(得分:3)
对_Atomic
限定的对象(和atomic_int
只是另一种写法)的操作保证具有顺序一致性。您会在语义部分的末尾提到每个操作数。 (也许缺少对作业的提及。)
您的代码在两个地方不正确:初始化必须使用ATOMIC_VAR_INIT
宏(7.17.2.1),并且memcpy
未定义(大小可能不一致),尽管它可能会起作用大多数架构。
也是行
tmp = mc + 4; // Arithmetic
没有做您的评论所声称的内容。这不是原子对象的算术,而是普通加法后的加载。更有趣的是
mc += 4; // Arithmetic
这是一个具有顺序一致性的原子操作。