c++ - values - diferencia entre el bool atómico estándar y la bandera atómica
boolean variable (2)
No estaba al tanto de las variables std::atomic
, pero sí sobre el std::mutex
(¡extraño derecho!) Provisto por el estándar; Sin embargo, una cosa llamó mi atención: hay dos tipos atómicos que parecen parecidos (para mí) proporcionados por el estándar, que se enumeran a continuación:
std::atomic<bool>
typestd::atomic_flag
type
También se menciona con el ejemplo de tipo std::atomic_flag type
-
std :: atomic_flag es un tipo booleano atómico. A diferencia de todas las especializaciones de std :: atomic, se garantiza que está libre de bloqueo. A diferencia de std :: atomic, std :: atomic_flag no proporciona operaciones de carga o almacenamiento.
Lo cual no entiendo. ¿No se garantiza que el std::atomic bool type
no tenga bloqueo? ¿Entonces no es atómico o qué?
Entonces, ¿cuál es la diferencia entre los dos y cuándo debo usar cuál?
std :: atomic bool tipo no garantizado para ser bloqueado?
Correcto. std::atomic
puede implementarse utilizando bloqueos.
¿Entonces no es atómico o qué?
std::atomic
es atómico, ya sea que se haya implementado mediante bloqueos o sin él. std::atomic_flag
está garantizado para implementarse sin utilizar bloqueos.
Entonces, ¿cuál es la diferencia b / w dos
La principal diferencia además de la garantía de bloqueo es:
std::atomic_flag
no proporciona operaciones de carga o almacenamiento.
y cuando debo usar cual?
Normalmente, querrá usar std::atomic<bool>
cuando necesite una variable booleana atómica. std::atomic_flag
es una estructura de bajo nivel que se puede usar para implementar estructuras atómicas personalizadas.
std::atomic<T>
garantiza que los accesos a la variable serán atómicos. Sin embargo, no dice cómo se logra la atomicidad. Puede estar usando una variable sin bloqueo, o usando un bloqueo. La implementación real depende de su arquitectura de destino y del tipo T
std::atomic_flag
por otra parte está garantizado para implementarse utilizando una técnica sin bloqueo.