2014-12-02 15 views
5

Supposed ho la seguente classe:Accesso non inizializzata variabile privata atomica in C++

class A 
{ 
public: 
... 
... 
void incrementN() {++n_;} 
uint64_t getN() {return n_;} 

private: 
std::atomic<uint64_t> n_; 
... 
... 

}; 

Si supponga che ho inizializzare tutte le altre variabili della classe, ad eccezione n_ e che questo non è thread storage locale, quindi non c'è nessuna inizializzazione zero.

Ho creato un oggetto di classe A e continuo a chiamare incrementN().

Se ad un certo punto che voglio il valore di n_, e chiamo getN(), possono causare questo la routine load() per l'atomica n_ il crash?

+0

Avete un costruttore di default 'A' o qualsiasi costruttore' A'? Se non si dispone di costruttori o di un costruttore predefinito ('A() = default;'), il costruttore predefinito generato dal compilatore chiamerà il costruttore predefinito di tutti i membri non statici ([riferimento] (http: // it .cppreference.com/w/cpp/language/default_constructor)), e il costruttore ['std :: atomic'] predefinito (http://en.cppreference.com/w/cpp/atomic/atomic/atomic) sarà chiamato. –

+0

Sì, ho un costruttore per A e inizializza le altre variabili di A, ma non inizializza 'n_' – user1715122

+0

@JoachimPileborg n_ è inizializzato di default, l'oggetto è costruito, il suo valore non è specificato, quindi non è UB. – Rost

risposta

0

La variabile n_ membro è solo non inizializzata. L'accesso al campo causerà una lettura in memoria e non c'è motivo di bloccarsi, sebbene non sia noto il layout di questi 8 byte di memoria.

Il fatto che il membro sia atomico non ha importanza qui. Farà in modo che il compilatore non utilizzi alcuna ottimizzazione su questa specifica variabile e potrebbe anche causare uno sfratto della cache line alla RAM ad ogni scrittura.

Problemi correlati