¿Puede una operación de lectura / escritura bool no ser atómica en x86?

Digamos que tenemos dos hilos, uno lee un bool en un bucle y otro puede alternarlo en determinados momentos. Personalmente creo que esto debería ser atómico porque sizeof(bool) en C ++ es de 1 byte y no se leen / escriben los bytes parcialmente, pero quiero estar 100% seguro.

¿Entonces, si o no?

EDITAR :

También para referencia futura, ¿se aplica lo mismo a int ?

Todo depende de lo que realmente quiere decir con la palabra “atómico”.

¿Quiere decir “el valor final se actualizará de una vez” (sí, en x86 que definitivamente está garantizado para un valor de byte y cualquier valor alineado correctamente hasta 64 bits como mínimo) o “si configuro esto en verdadero (o falso), ningún otro hilo leerá un valor diferente después de que lo haya configurado “(no es una certeza tan cierta, necesita un prefijo de” locking “para garantizar eso).

Hay tres problemas distintos que abordan los tipos “atómicos” en C ++ 11:

  1. rasgado: una lectura o escritura implica múltiples ciclos de bus, y un cambio de hilo ocurre en el medio de la operación; esto puede producir valores incorrectos.

  2. coherencia de caché: una escritura de un hilo actualiza el caché de su procesador, pero no actualiza la memoria global; una lectura de un hilo diferente lee la memoria global y no ve el valor actualizado en la memoria caché del otro procesador.

  3. Optimización del comstackdor: el comstackdor mezcla el orden de las lecturas y escrituras bajo la suposición de que no se accede a los valores desde otro subproceso, lo que genera un caos.

El uso de std::atomic garantiza que estos tres problemas se gestionen correctamente. No usar std::atomic te deja adivinando, con, en el mejor de los casos, código no portátil.

x86 solo garantiza lecturas y escrituras alineadas con palabras del tamaño de palabra. No garantiza ninguna otra operación, a menos que sea explícitamente atómico. Además, por supuesto, tiene que convencer a su comstackdor para que realmente emita las lecturas y escrituras relevantes en primer lugar.