赋值对 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
这是一个具有顺序一致性的原子操作。
例如,
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
这是一个具有顺序一致性的原子操作。