如何初始化静态 std::atomic 数据成员

问题描述 投票:0回答:3

我想以线程安全的方式为名为

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 stdatomic
3个回答
67
投票

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

是的,错误说得很清楚。

有人知道如何让这段代码真正发挥作用吗?

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

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

使用直接初始化,这不会:

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

无论如何,你可能应该更喜欢这样,除非你喜欢阅读不必要的冗长代码。


33
投票

定义如何

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

6
投票

您也可以使用

atomic_init
:

std::atomic<int> data;
std::atomic_init(&data, 0);
© www.soinside.com 2019 - 2024. All rights reserved.