使用ATOMIC_FLAG_INIT和std :: atomic_flag :: clear有什么区别

时间:2013-11-26 05:12:45

标签: c++ c++11 atomic

以下两个代码段是否相同:

std::atomic_flag lock = ATOMIC_FLAG_INIT;

std::atomic_flag lock;
lock.clear();

似乎第二个可以允许锁定处于未知状态,只需点击几下

第一个代码段是否总是具有已知状态?

2 个答案:

答案 0 :(得分:9)

ATOMIC_FLAG_INIT是一个实现定义的宏,可以保证在你发布的表达式中工作。例如,它可以用于初始化您在命名空间范围内定义的atomic_flag。它还保证标志将被清除,如果标志本身具有静态存储持续时间,则初始化也将是静态的。

第二组语句是初始化,然后是清除标志。由于atomic_flag的状态在默认构造后未指定,因此它确实意味着该标志处于未指定状态,直到clear()被执行。

答案 1 :(得分:5)

是(按29.7[atomics.flag] §4):

  

ATOMIC_FLAG_INIT的定义方式可以用于将atomic_flag类型的对象初始化为清除状态。对于静态持续时间对象,该初始化应该是静态的。未指定是否未初始化atomic_flag   object的初始状态为set或clear。