C17 标准第 7.17.2.2 节规定了以下有关
void atomic_init(volatile A *obj, C value)
中定义的<stdatomic.h>
的内容:
虽然这个函数初始化了一个原子对象,但它并不能避免数据竞争;即使通过原子操作,对正在初始化的变量的并发访问也会构成数据竞争。
既然拥有原子对象和原子操作的全部目的是为了避免数据竞争,那么为什么存在
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 );
但这只为动态分配变量留下了一种选择。
_Atomic int *p = malloc( sizeof( _Atomic int ) );
atomic_init( p, 7 );