2012-01-19 24 views
10

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++?

+2

Vedere anche http://stackoverflow.com/questions/54188/are-c-reads-and-writes-of-an-int-atomic – sth

+1

C++ non avrebbe avuto bisogno di 'atomico ' se fosse il caso :) –

risposta

14

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.

+0

Puoi ottenere boost.atomic qui: http://www.chaoticmind.net/~hcb/projects/boost.atomic /doc/index.html –

2

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.

+8

C++ 11 * fa * definisce un comportamento di threading e il modello di memoria associato. –

+1

@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

Problemi correlati