初始化静态原子成员变量

Tei*_*man 23 c++ const atomic c++11

我想以线程安全的方式为名为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
}
Run Code Online (Sandbox Code Playgroud)

编译以上结果会出现以下错误:

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
Run Code Online (Sandbox Code Playgroud)

Mik*_*our 46

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

是的,错误说得很清楚.

有没有人知道实际让这段代码工作的方法?

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

std::atomic<int> order::c = std::atomic<int>(0);
Run Code Online (Sandbox Code Playgroud)

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

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

无论如何,你应该更喜欢这个,除非你喜欢阅读不必要的详细代码.


Som*_*ude 25

怎么定义

std::atomic<int> order::c{0}
Run Code Online (Sandbox Code Playgroud)


anh*_*dbk 6

您还可以使用atomic_init

std::atomic<int> data;
std::atomic_init(&data, 0);
Run Code Online (Sandbox Code Playgroud)

  • 这不会在编译期间初始化? (2认同)
  • @anicicn有点晚了,但是静态变量的初始化保证只运行一次并且是线程安全的。之后,它本质上只是一个常规的 int,即不是线程安全的。请参阅/sf/ask/567148781/ (2认同)