2013-12-08 25 views
15

Vorrei generare identificatori per una classe denominata in ordine in modo thread-safe. Il codice seguente non viene compilato. So che i tipi atomici non hanno costruttori di copia e presumo che questo spieghi perché questo codice non funziona. Qualcuno conosce un modo per far funzionare questo codice? Sto ancora imparando, quindi per favore fatemi sapere se sono sulla strada sbagliata (se così fosse, sarei grato se poteste indicarmi un approccio alternativo). Grazie!Inizializza variabile membro atomico statico

#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 
} 

Compilare i risultati di cui sopra nel seguente errore:

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 

risposta

28

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

Sì, l'errore dice che piuttosto chiaramente.

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

Invece di copia-inizializzazione da una temporanea, che richiede un costruttore di copia accessibile:

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

uso diretto-inizializzazione, che non lo fa:

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

probabilmente si dovrebbe preferisci comunque, a meno che non ti piaccia leggere codice inutilmente prolisso.

19

Come circa la definizione

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

Grazie mille Joachim! Ho svalutato la tua risposta, ma accetterò Mike perché è un po 'più prolisso. Spero non ti dispiaccia! ;) – Teisman

1

Inoltre è possibile utilizzare atomic_init:

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