gpt4 book ai didi

c++ - C/C++ 内存模型是否允许相同字节的不同粒度的原子?

转载 作者:行者123 更新时间:2023-12-02 10:04:45 25 4
gpt4 key购买 nike

假设我有以下类型:

struct T {
int32 high;
int32 low;
};

是否定义了在所有 atomic_load 上执行原子访问(使用,例如 atomic_fetch_addx )的行为? , &x->high , 和 &x->low (假设 U* x )?

我的理解是 C/C++ 内存模型是使用单个位置的历史定义的(以适应弱内存架构)。如果访问可以跨位置,这是否意味着跨位置同步?如果是这种情况,那么我认为这意味着历史本质上是按字节和访问 int就像在底层 4(或 8)个字节之间进行同步一样。

编辑 :修改示例以避免 union ,因为问题的主要部分是关于并发模型。

编辑 :修改为使用来自 stdatomic.h 的标准原子

最佳答案

对于 C11/C18(我不能谈论 C++)标准 atomic_xxx() <stdatomic.h> 的功能仅定义为取 _Atomic合格的论据。如此做atomic_xxx()对您的字段进行操作 struct T你需要:

struct T {
_Atomic int32 high;
_Atomic int32 low;
} ;

struct T foo, bar ;

然后你就可以做(例如) atomic_fetch_add(&foo->high, 42) .但是 bar = atomic_load(&foo)将是未定义的。

相反,你可以:
struct T {
int32 high;
int32 low;
} ;

_Atomic struct T foo ;
struct T bar ;

现在 bar = atomic_load(&foo)被定义为。但可以访问 foo 中的任何单个字段未定义——无论是否为 _Atomic .

遵守标准, _Atomic xxxx对象应该被认为与“普通”完全不同 xxxx对象——它们可能有不同的大小、表示和对齐方式。类型转换 xxxx往/返 _Atomic xxxx因此,并不比投一个 struct 更明智到/来自另一个不同的 struct .

但是 , 用于 gcc 和 __atomic_xxx()内置插件,您可以执行处理器支持的任何操作。事实上,对于 gcc 来说,(否则)标准 atomic_xxx()将接受不是 _Atomic 的参数限定类型,并映射到内置函数。另一方面,clang 对待传递一个 not _Atomic标准函数的限定类型作为错误。恕我直言,这是 gcc 中的一个错误 <stdatomic.h> .

关于c++ - C/C++ 内存模型是否允许相同字节的不同粒度的原子?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60832516/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com