问题:
您不能使用复制初始化,因为std::atomic_bool 不可复制构造:
std::atomic_bool World::mStopEvent = false; // ERROR!
其实上面等价于:
std::atomic_bool World::mStopEvent = std::atomic_bool(false); // ERROR!
但是,您可以使用直接初始化:
std::atomic_bool World::mStopEvent(false);
您可以根据自己的意愿选择使用大括号代替圆括号:
std::atomic_bool World::mStopEvent{false};
错误:
虽然无论您选择哪种编译器,复制初始化都是非法的,但似乎 VC11 附带的标准库的实现有一个错误,不允许您执行直接初始化。
那么我应该如何初始化这样一个变量呢?
解决方法:
作为一种可能的解决方法,您可以提供一对静态 getter/setter 包装器,它们分别设置和返回原子布尔标志的值,但在确保它已至少初始化一次且不超过一次以线程安全的方式到达所需的初始值(您可以考虑这是某种延迟初始化):
#include <atomic>
#include <mutex>
struct World
{
static bool is_stop_event_set()
{
std::call_once(mStopEventInitFlag, [] () { mStopEvent = false; });
return mStopEvent;
}
static void set_stop_event(bool value)
{
std::call_once(mStopEventInitFlag, [value] () { mStopEvent = value; });
mStopEvent = value;
}
static std::atomic_bool mStopEvent;
static std::once_flag mStopEventInitFlag;
};
std::atomic_bool World::mStopEvent;
std::once_flag World::mStopEventInitFlag;
现在不是直接访问mStopEvent,而是通过is_stop_event_set()函数读取其值:
#include <iostream>
int main()
{
std::cout << World::is_stop_event_set(); // Will return false
}