In realtà ho sentito affermazioni in entrambi i modi. Sospetto che non lo siano, ma volevo sistemare l'argomento.L'assegnazione puntatore è atomica in C++?
risposta
C++ 03 non sa dell'esistenza di thread, quindi il concetto di atomicità non ha molto senso per C++ 03, nel senso che non dice nulla a riguardo.
C++ 11 conosce i thread, ma ancora una volta non dice nulla sull'atomicità dell'assegnazione dei puntatori. Tuttavia C++ 11 contiene std::atomic<T*>
, che è garantito per essere atomico.
Si noti che anche se la scrittura su un puntatore non elaborato è atomica sulla piattaforma, il compilatore è ancora libero di spostare tale asserzione, in modo tale da non comprare davvero nulla.
Se avete bisogno di scrivere a un puntatore che è condiviso tra i thread utilizzare uno std::atomic<T*>
(o il non ancora ufficiale boost::atomic<T*>
, GCCS intrinseche o finestre atomiche interbloccate *) o avvolgere tutti gli accessi a tale puntatore in mutex.
Puoi ottenere boost.atomic qui: http://www.chaoticmind.net/~hcb/projects/boost.atomic /doc/index.html –
La norma C++ non definisce un comportamento di threading specifico. A seconda del compilatore e della piattaforma, l'assegnazione del puntatore potrebbe essere o meno atomica.
C++ 11 * fa * definisce un comportamento di threading e il modello di memoria associato. –
@Frizlab e J.N. siete entrambi corretti. Come dire che Porsche è un'auto sportiva è una cosa corretta ma imprecisa, poiché non tutti i modelli sono auto sportive :) – mloskot
Vedere anche http://stackoverflow.com/questions/54188/are-c-reads-and-writes-of-an-int-atomic – sth
C++ non avrebbe avuto bisogno di 'atomico' se fosse il caso :) –