c++ x86 boolean atomic

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



boolean atomic (3)

Hay tres problemas separados que los tipos "atómicos" en la dirección de C ++ 11:

  1. lagrimeo: una lectura o escritura implica múltiples ciclos de bus, y se produce un cambio de hilo en medio de la operación; Esto puede producir valores incorrectos.

  2. coherencia de caché: una escritura desde 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 compilador: el compilador baraja el orden de las lecturas y las escrituras bajo el supuesto de que no se accede a los valores desde otro hilo, lo que resulta en un caos.

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

Digamos que tenemos dos hilos, uno está leyendo un bool en un bucle y otro puede cambiarlo en ciertos momentos. Personalmente creo que esto debería ser atómico porque sizeof(bool) en C ++ es de 1 byte y no lee / escribe bytes parcialmente, pero quiero estar 100% seguro.

¿Entonces, si o no?

EDITAR :

También para futuras referencias, ¿se aplica lo mismo a int ?


Todo depende de lo que realmente quieras decir con la palabra "atómico".

¿Quiere decir que "el valor final se actualizará de una vez" (sí, en x86 eso definitivamente está garantizado para un valor de byte, y cualquier valor alineado correctamente de al menos 64 bits), o "si lo configuro como verdadero (o falso), ningún otro subproceso leerá un valor diferente después de haberlo configurado "(eso no es una certeza, necesita un prefijo de" bloqueo "para garantizarlo).


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