如果它是一个类的成员,我如何初始化一个atomic_flag变量?

Arn*_*age 11 c++ multithreading c++11

我正在尝试使用atomic_flag实现自旋锁.我知道使用C++ 11我必须初始化atomic_flag变量,但我无法编译它.我的代码看起来像这样:

class SpinLock 
{
 public:
  SpinLock()
   :m_flag(ATOMIC_FLAG_INIT)  /// syntax error : missing ')' before '{'
  {
  }

  void lock()
  {
    while (m_flag.test_and_set() == true){}
  }

  void unlock()
  {
    m_flag.clear();
  }

 private:
  SpinLock &operator=(const SpinLock &);

 private:
  std::atomic_flag    m_flag;
};
Run Code Online (Sandbox Code Playgroud)

当我编译代码时,我会在'{''之前得到'语法错误:缺失')'.我也看到ATOMIC_FLAG_INIT定义为{0},但是这样写的正确方法是什么呢?

以下编译,但它仍然是线程安全吗?

  SpinLock()
  {
         m_flag.clear();
  }
Run Code Online (Sandbox Code Playgroud)

Mih*_*tan 12

Visual Studio 2012不支持c ++ 11初始化列表(请参阅c ++ 11支持页面)

但是Visual Studio 2013支持它(请参阅统一初始化文档中的"initializer_list构造函数"部分)

同时在你的情况下,构造函数可以只使用赋值 m_flag = ATOMIC_FLAG_INIT;

更新: 似乎它没有测试上面的分配,但使用m_flag.clear();实现了相同的结果

  • 这里的问题是`atomic_flag`没有赋值运算符,因此在构造函数体中使用`ATOMIC_FLAG_INIT`初始化该标志也是不可能的.正确的方法是使用默认构造函数初始化标志(使其状态未指定),然后调用`.clear()`来设置状态.这确实是VS实现的烦人错误. (6认同)
  • @ComicSansMS如上所述无法初始化atomic_flag不是VS错误,它是atomic_flag上的[限制](http://en.cppreference.com/w/cpp/atomic/ATOMIC_FLAG_INIT). (4认同)