【发布时间】:2016-07-04 15:58:01
【问题描述】:
例如,
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 肯定有可能是未定义的行为。
对原子原语的原语操作应该如何表现?
谢谢!
【问题讨论】: