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

问题描述 投票:0回答:1

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

c atomic
1个回答
2
投票

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 );
© www.soinside.com 2019 - 2024. All rights reserved.