【问题标题】:Initialize static atomic member variable初始化静态原子成员变量
【发布时间】:2013-12-08 11:50:00
【问题描述】:

我想以线程安全的方式为名为 order 的类生成标识符。下面的代码无法编译。我知道原子类型没有复制构造函数,我假设这解释了为什么这段代码不起作用。有谁知道让这段代码真正起作用的方法吗?我还在学习,所以如果我走错了路,也请告诉我(如果是这样,如果你能指出另一种方法,我将不胜感激)。谢谢!

#include <atomic>
#include <iostream>

class order {
public: 
    order() { id=c.fetch_add(1); }
    int id;
private:
    static std::atomic<int> c;
};

std::atomic<int> order::c = std::atomic<int>(0);

int main() {
    order *o1 = new order();
    order *o2 = new order();
    std::cout << o1->id << std::endl; // Expect 0
    std::cout << o2->id << std::endl; // Expect 1
}

编译上面的结果如下错误:

order.cpp:45:51: error: use of deleted function 
        ‘std::atomic<int>::atomic(const std::atomic<int>&)’
In file included from order.cpp:3:0:
/usr/include/c++/4.7/atomic:594:7: error: declared here

【问题讨论】:

    标签: c++ c++11 constants atomic


    【解决方案1】:

    我知道原子类型没有复制构造函数,我认为这可以解释为什么这段代码不起作用。

    是的,错误说得很清楚。

    有人知道让这段代码真正工作的方法吗?

    而不是从临时复制初始化,这需要一个可访问的复制构造函数:

    std::atomic<int> order::c = std::atomic<int>(0);
    

    使用直接初始化,而不是:

    std::atomic<int> order::c(0);   // or {0} for a more C++11 experience
    

    你可能更喜欢这样,除非你喜欢阅读不必要的冗长代码。

    【讨论】:

      【解决方案2】:

      定义如何

      std::atomic<int> order::c{0}
      

      【讨论】:

      • 非常感谢约阿希姆!我赞成您的回答,但我会接受迈克的回答,因为它有点冗长。希望你不要介意! ;)
      【解决方案3】:

      你也可以使用atomic_init:

      std::atomic<int> data;
      std::atomic_init(&data, 0);
      

      【讨论】:

      • 编译时不会初始化这个?
      • 静态变量线程对 c++11 来说不是安全的吗?我在问题中看到了 ++11 标记。那么为什么我们首先需要原子?为什么我们不能只使用常规 int?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 2020-12-09
      • 1970-01-01
      • 1970-01-01
      • 2011-10-06
      相关资源
      最近更新 更多