Un'operazione di lettura/scrittura bool può non essere atomica su x86?

Un'operazione di lettura/scrittura bool può non essere atomica su x86?

Esistono tre problemi separati che i tipi "atomici" digitano nell'indirizzo C++11:

  1. strappo:una lettura o una scrittura comporta più cicli di bus e un cambio di thread si verifica nel mezzo dell'operazione; questo può produrre valori errati.

  2. coerenza della cache:una scrittura da un thread aggiorna la cache del suo processore, ma non aggiorna la memoria globale; una lettura da un thread diverso legge la memoria globale e non vede il valore aggiornato nella cache dell'altro processore.

  3. ottimizzazione del compilatore:il compilatore mescola l'ordine di lettura e scrittura partendo dal presupposto che non si accede ai valori da un altro thread, provocando il caos.

Usando std::atomic<bool> garantisce che tutti e tre questi problemi siano gestiti correttamente. Non utilizzando std::atomic<bool> ti lascia indovinare, con, nella migliore delle ipotesi, codice non portatile.


Tutto dipende da cosa intendi effettivamente con la parola "atomico".

Intendi "il valore finale verrà aggiornato in una volta sola" (sì, su x86 è sicuramente garantito per un valore in byte - e qualsiasi valore allineato correttamente almeno fino a 64 bit) o ​​"se lo imposto su true (o false), nessun altro thread leggerà un valore diverso dopo averlo impostato" (non è proprio una certezza:è necessario un prefisso "blocco" per garantirlo).


x86 garantisce solo letture e scritture allineate alle parole della dimensione della parola. Non garantisce altre operazioni, se non esplicitamente atomiche. Inoltre, ovviamente, devi convincere il tuo compilatore a emettere effettivamente le letture e le scritture rilevanti in primo luogo.