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 );
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 );