gpt4 book ai didi

C11 stdatomic 和 calloc

转载 作者:太空狗 更新时间:2023-10-29 16:49:53 35 4
gpt4 key购买 nike

我有一个包含原子字段的结构:

#include <stdatomic.h>

struct s {
...
atomic_int a;
};

这个结构是用calloc分配的:

struct s *p = calloc(1, sizeof(struct s));

期望 p->a 初始化为 0 是否可移植?代码中有足够的障碍,因此弱一致性初始化是可以的,但初始值是否保证为 0?

最佳答案

不,这通常是不可移植的。 calloc 仅保证基础对象的字节级 0 值。对于(可能)具有状态的类型,这不等同于初始化。您肯定必须使用 atomic_init 将您的对象置于有效状态。

这是因为除了基本对象之外还持有“锁”的平台,因为它们没有实现相应的汇编程序指令。因此,为了便于移植,您确实需要对所有非静态分配的原子对象使用 ATOMIC_VAR_INITatomic_init

就是说,我不知道有任何现有平台需要这样的 atomic_int。如果您的平台将 ATOMIC_INT_LOCK_FREE 设置为 2 并且 sizeof(atomic_int)==sizeof(int),您可以相对确定您的策略有效.您可以在 _Static_assert 中对其进行测试。

关于C11 stdatomic 和 calloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30535262/

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