atomic_init 在 C 中不是线程安全的,那么它为什么存在呢?

atomic_init is not thread safe in C, so why does it exist?

C17 标准第 7.17.2.2 节规定了以下关于 <stdatomic.h> 中定义的void atomic_init(volatile A *obj, C value)

Although this function initializes an atomic object, it does not avoid data races; concurrent access to the variable being initialized, even via an atomic operation, constitutes a data race.

既然拥有原子对象和原子操作的全部意义在于避免数据竞争,那么为什么要存在 atomic_init 函数呢?例如,为什么不执行以下操作?

_Atomic int x = 7; 

而不是:

_Atomic int x; 
atomic_init(&x, 7);

另外,当它真的是一个作业时,为什么它被称为 atomic_init

Atomic 值可能有用于实现所需语义的隐藏字段,这些字段需要以某种方式进行初始化。这可以使用 C 变量初始值设定项或使用 atomic_init.

来实现

对于静态或自动变量,提供两个选项:

_Atomic int x = 7;
_Atomic int x; 
atomic_init( &x, 7 );

但这只为 dynamically-allocated 个变量留下一个选项。

_Atomic int *p = malloc( sizeof( _Atomic int ) );
atomic_init( p, 7 );