如何初始化和使用C11 _Atomic变量?

joe*_*oey 4 c atomic c11

是否允许以下​​代码?

_Atomic(unsigned int) a = 1;
if (a == 0) {

}
Run Code Online (Sandbox Code Playgroud)

C11规范(n1570)在6.3.2.1p2处说:

如果左值具有原子类型,则该值具有左值类型的非原子版本.

所以这似乎说没关系.

Jen*_*edt 7

不,这样的初始化是不行的.您必须使用ATOMIC_VAR_INIT初始化原子对象.从C11 7.17.2.1:

ATOMIC_VAR_INIT宏扩展为适合初始化与value初始化兼容的类型的原子对象的标记序列.具有自动存储持续时间但未使用ATOMIC_VAR_INIT显式初始化的原子对象最初处于不确定状态; 但是,保证具有静态或线程本地存储持续时间的对象的默认(零)初始化会产生有效状态.

否则,对象将处于有效状态,但"不确定",因此您不知道它具有哪个值.