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

Supponiamo di avere due thread, uno sta leggendo un bool in un ciclo e un altro lo può triggersre in determinati momentjs. Personalmente penso che questo dovrebbe essere atomico perché sizeof(bool) in C ++ è di 1 byte e non si leggono / scrivono i byte parzialmente ma voglio essere sicuro al 100%.

Quindi sì o no?

MODIFICA :

Anche per riferimento futuro, lo stesso vale per int ?

Dipende tutto da cosa intendi in realtà con la parola “atomico”.

Vuoi dire “il valore finale sarà aggiornato in un colpo solo” (sì, su x86 che è sicuramente garantito per un valore di byte – e qualsiasi valore allineato correttamente fino a 64 bit almeno), o “se lo imposto su true (o false), nessun altro thread leggerà un valore diverso dopo averlo impostato “(non è proprio così sicuro – hai bisogno di un prefisso” lock “per garantirlo).

Ci sono tre problemi separati che i tipi “atomici” in C ++ 11 indirizzo:

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

  2. coerenza della cache: una scrittura da un thread aggiorna la cache del 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 mischia l’ordine delle letture e delle scritture partendo dal presupposto che i valori non sono accessibili da un altro thread, causando il caos.

L’utilizzo di std::atomic garantisce che tutti e tre questi problemi siano gestiti correttamente. Non usare std::atomic ti lascia indovinare, con, nel migliore dei casi, codice non-portatile.

x86 garantisce solo letture allineate alla parola e scritture della dimensione della parola. Non garantisce altre operazioni, a meno che non sia esplicitamente atomico. Inoltre, ovviamente, devi convincere il tuo compilatore a pubblicare effettivamente le letture e le scritture rilevanti in primo luogo.