C11 stdatomic和calloc

jch*_*jch 10 c atomic c11

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

#include <stdatomic.h>

struct s {
    ...
    atomic_int a;
};
Run Code Online (Sandbox Code Playgroud)

该结构分配有calloc:

struct s *p = calloc(1, sizeof(struct s));
Run Code Online (Sandbox Code Playgroud)

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

Jen*_*edt 3

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

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

也就是说,我不知道有任何现有平台需要如此复杂的atomic_int. 如果您的平台已ATOMIC_INT_LOCK_FREE设置为2sizeof(atomic_int)==sizeof(int),您可以相对确定您的策略有效。您可以在_Static_assert.