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:
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.
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.
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.