c++ multithreading c++11 atomic

¿El estándar C++ 11 garantiza que std:: atomic<> se implementa como una operación atómica?



multithreading c++11 (2)

El estándar C ++ no garantiza que std::atomic<T> operaciones std::atomic<T> sean atómicas. Sin embargo, puede usar std::atomic<T>::is_lock_free() para averiguar si la operación de std::atomic<T> está libre de bloqueos 29.6.5 [atomics.types.operations.req] párrafo 7:

Devuelve: Verdadero si las operaciones del objeto están libres de bloqueo, falso de lo contrario.

Si no está libre de bloqueos, seguirá haciendo la sincronización requerida, pero utiliza algún bloqueo para hacerlo.

Estoy en un cruce, estoy tratando de elegir uno entre la estructura de datos basada en bloqueo mutex y la estructura de datos sin bloqueo (y posiblemente sin espera).

Mientras profundizaba un poco más, no encontré nada sobre el hecho de que el estándar C ++ 11 admite operaciones atómicas para tipos atómicos, ni siquiera para integrales basadas en ancho como atomic_uint32_t . En otras palabras, no es solo la interfaz std::atomic<> que no se otorga para ser realmente atómica, lo único que parece que se concede para ser atómico en toda la biblioteca estándar es std::atomic_flag .

¿Es esto cierto o me estoy perdiendo algo? Cuál es la razón para eso ? Me refiero al estándar que llama "atómico" algo que claramente no es atómico en absoluto y es algo que incluso se permite usar mutex o bloquear llamadas bajo el capó.


Si por atómico quiere decir, usar soporte de hardware sin bloqueos, entonces sí, el estándar no le da una garantía para eso. ¿Por qué? Bueno, porque diferentes arquitecturas soportan diferentes tipos de atomicidad de hardware. std::atomic<> tiene el práctico método is_lock_free() que se puede usar para verificar si el objeto dado está realmente sin bloqueo, o usa un bloqueo internamente para garantizar operaciones atómicas. Puede usar eso y verificar su hardware de destino ya sea que esté bloqueado o no, y luego decidir qué estructura de datos buscar.

Sin embargo, dicho esto, si la arquitectura de destino tiene soporte de hardware para operaciones atómicas para las integrales de ancho fijo en las que está interesado, y no obtuvo su copia de la biblioteca estándar de la tienda de software en el ghetto, es probable Voy a usar el hardware en lugar de un bloqueo completo.