2013-12-08 102 views
15

我想以線程安全的方式爲名爲的訂單生成標識符。下面的代碼不能編譯。我知道原子類型沒有拷貝構造函數,我假設這解釋了爲什麼這個代碼不起作用。有沒有人知道一種方法來實際獲得這個代碼的工作?我還在學習,所以請讓我知道,如果我在錯誤的軌道上(如果是這樣,我會很感激,如果你能指點我一個替代方法)。謝謝!初始化靜態原子成員變量

#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 

回答

28

I know that the atomic types do not have copy constructors, and I assume that explains why this code does not work.

是的,錯誤說,很清楚。

Does anybody know a way to actually get this code to work?

而不是拷貝初始化從一個臨時的,這需要一個可訪問的拷貝構造函數:

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

使用直接初始化,這並不:

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

你應該無論如何,除非你喜歡閱讀不必要的冗長代碼。

19

如何定義

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

非常感謝約阿希姆!我已經提出了你的答案,但我會接受邁克的,因爲它有點冗長。希望你不介意! ;) – Teisman

1

您也可以使用atomic_init

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