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

时间:2013-03-10 00:47:27

标签: c atomic c11

是否允许以下​​代码?

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

}

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

  

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

所以这似乎说没关系。

1 个答案:

答案 0 :(得分:7)

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

  

ATOMIC_VAR_INIT宏扩展为适合的标记序列   初始化一个类型的原子对象   初始化 - 与值兼容。具有自动的原子对象   未使用显式初始化的存储持续时间   ATOMIC_VAR_INIT最初处于不确定状态;然而   具有静态或线程局部的对象的默认(零)初始化   存储持续时间保证产生有效状态。

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