Risposta breve: Non utilizzare volatili per garantire l'atomicità.
Risposta lunga Si potrebbe pensare che dal momento che le CPU di gestire le parole in una singola istruzione, le operazioni di semplice parola sono intrinsecamente thread-safe. L'idea di utilizzare volatile
è quella di assicurare che il compilatore non faccia alcuna ipotesi sul valore contenuto nella variabile condivisa.
Su moderne macchine multiprocessore, questa ipotesi è errata. Dato che diversi core del processore avranno normalmente una propria cache, potrebbero verificarsi circostanze in cui le letture e le scritture nella memoria principale vengono riordinate e il codice finisce per non comportarsi come previsto.
Per questo motivo sempre utilizzare blocchi come mutex o sezioni critiche quando la memoria di accesso condivisa tra thread. Sono sorprendentemente economici quando non ci sono contese (normalmente non è necessario effettuare una chiamata di sistema) e faranno la cosa giusta.
In genere impediscono le letture e le scritture fuori ordine richiamando un'istruzione Data Memory Barrier (DMB su ARM) che garantisce che le letture e le scritture avvengano nell'ordine corretto. Guarda here per maggiori dettagli.
L'altro problema con volatile
è che impedirà al compilatore di effettuare ottimizzazioni anche se perfettamente a posto.
È necessario C++ 0x atomica –
C1X fornisce anche le operazioni atomiche – Christoph
Sì, ho pensato che anche. Mi stavo solo chiedendo, perché il codice in questo articolo di Wikipedia: http://en.wikipedia.org/wiki/Busy_waiting è semplicemente sbagliato. –