Compartir vía


<atomic>

Define las clases y las plantillas de clase que se van a usar para crear tipos que admitan operaciones atómicas.

Sintaxis

#include <atomic>

Comentarios

Nota:

En el código que se compila mediante /clr:pure, este encabezado está bloqueado. Tanto /clr:pure como /clr:safe están en desuso en Visual Studio 2017 y versiones posteriores.

Una operación atómica tiene dos propiedades clave que ayudan a usar varios subprocesos para manipular correctamente un objeto sin emplear bloqueos mutex.

  • Dado que una operación atómica es indivisible, una segunda operación atómica sobre el mismo objeto desde un subproceso diferente puede obtener el estado del objeto únicamente antes o después de la primera operación atómica.

  • Según su argumento memory_order, una operación atómica establece requisitos de ordenación para la visibilidad de los efectos de otras operaciones atómicas del mismo subproceso. Por consiguiente, impide las optimizaciones del compilador que infringen los requisitos de ordenación.

En algunas plataformas no sería posible implementar realmente las operaciones atómicas para algunos tipos sin usar bloqueos mutex. Un tipo atómico es lock-free si ninguna operación atómica sobre ese tipo emplea bloqueos.

C++11: en los controladores de señal, puede realizar operaciones atómicas sobre un objeto obj si obj.is_lock_free() o atomic_is_lock_free(x) son true.

La clase atomic_flag proporciona un tipo atómico mínimo que contiene una marca bool. Sus operaciones nunca tienen bloqueos.

La plantilla de clase atomic<T> almacena un objeto de su tipo de argumento T y proporciona acceso atómico a ese valor almacenado. Puede crear instancias de ella mediante cualquier tipo que se pueda copiar con memcpy y cuya igualdad se pueda probar con memcmp. En concreto, puede usarla con tipos definidos por el usuario que cumplan estos requisitos y, en muchos casos, con tipos de punto flotante.

La plantilla también tiene un conjunto de especializaciones para tipos enteros y una especialización parcial para punteros. Estas especializaciones proporcionan operaciones adicionales que no están disponibles a través de la plantilla principal.

Especializaciones de puntero

Las especializaciones parciales atomic<T *> se aplican a todos los tipos de puntero. Proporcionan métodos para la aritmética de puntero.

Especializaciones de entero

Las especializaciones atomic<integral> se aplican a todos los tipos enteros. Proporcionan operaciones adicionales que no están disponibles a través de la plantilla principal.

Cada tipo atomic<integral> tiene una macro correspondiente que se puede usar en if directive para determinar en tiempo de compilación si las operaciones de ese tipo tienen bloqueos o no. Si el valor de la macro es cero, las operaciones del tipo tienen bloqueos. Si el valor es 1, las operaciones pueden no tener bloqueos y se necesita una comprobación en tiempo de ejecución. Si el valor es 2, las operaciones no tienen bloqueos. Puede usar la función atomic_is_lock_free para determinar en tiempo de ejecución si las operaciones sobre el tipo tienen bloqueos o no.

Hay un tipo atómico con nombre correspondiente para cada uno de los tipos enteros que administra un objeto de ese tipo entero. Cada tipo atomic_integral tiene el mismo conjunto de funciones miembro que la instancia correspondiente de atomic<T> y se puede pasar a cualquiera de las funciones atómicas no miembro.

Tipo de atomic_integral Tipo entero Macro atomic_is_lock_free
atomic_char char ATOMIC_CHAR_LOCK_FREE
atomic_schar signed char ATOMIC_CHAR_LOCK_FREE
atomic_uchar unsigned char ATOMIC_CHAR_LOCK_FREE
atomic_char16_t char16_t ATOMIC_CHAR16_T_LOCK_FREE
atomic_char32_t char32_t ATOMIC_CHAR32_T_LOCK_FREE
atomic_wchar_t wchar_t ATOMIC_WCHAR_T_LOCK_FREE
atomic_short short ATOMIC_SHORT_LOCK_FREE
atomic_ushort unsigned short ATOMIC_SHORT_LOCK_FREE
atomic_int int ATOMIC_INT_LOCK_FREE
atomic_uint unsigned int ATOMIC_INT_LOCK_FREE
atomic_long long ATOMIC_LONG_LOCK_FREE
atomic_ulong unsigned long ATOMIC_LONG_LOCK_FREE
atomic_llong long long ATOMIC_LLONG_LOCK_FREE
atomic_ullong unsigned long long ATOMIC_LLONG_LOCK_FREE

Existen nombres de Typedef para especializaciones de la plantilla atómica para algunos de los tipos definidos en el encabezado <inttypes.h>.

Tipo atómico Typedef Nombre
atomic_int8_t atomic<int8_t>
atomic_uint8_t atomic<uint8_t>
atomic_int16_t atomic<int16_t>
atomic_uint16_t atomic<uint16_t>
atomic_int32_t atomic<int32_t>
atomic_uint32_t atomic<uint32_t>
atomic_int64_t atomic<int64_t>
atomic_uint64_t atomic<uint64_t>
atomic_int_least8_t atomic<int_least8_t>
atomic_uint_least8_t atomic<uint_least8_t>
atomic_int_least16_t atomic<int_least16_t>
atomic_uint_least16_t atomic<uint_least16_t>
atomic_int_least32_t atomic<int_least32_t>
atomic_uint_least32_t atomic<uint_least32_t>
atomic_int_least64_t atomic<int_least64_t>
atomic_uint_least64_t atomic<uint_least64_t>
atomic_int_fast8_t atomic<int_fast8_t>
atomic_uint_fast8_t atomic<uint_fast8_t>
atomic_int_fast16_t atomic<int_fast16_t>
atomic_uint_fast16_ atomic<uint_fast16_t>
atomic_int_fast32_t atomic<int_fast32_t>
atomic_uint_fast32_t atomic<uint_fast32_t>
atomic_int_fast64_t atomic<int_fast64_t>
atomic_uint_fast64_t atomic<uint_fast64_t>
atomic_intptr_t atomic<intptr_t>
atomic_uintptr_t atomic<uintptr_t>
atomic_size_t atomic<size_t>
atomic_ptrdiff_t atomic<ptrdiff_t>
atomic_intmax_t atomic<intmax_t>
atomic_uintmax_t atomic<uintmax_t>

Estructuras

Nombre Descripción
atomic (Estructura) Describe un objeto que realiza operaciones atomic sobre un valor almacenado.
atomic_flag (Estructura) Describe un objeto que establece y borra una marca bool de forma atómica.

Enumeraciones

Nombre Descripción
Enumeración memory_order Proporciona nombres simbólicos para las operaciones de sincronización en ubicaciones de memoria. Estas operaciones afectan a cómo las asignaciones de un subproceso se hacen visibles en otro.

Functions

En la lista siguiente, las funciones que no terminan en _explicit tienen la semántica _explicit correspondiente, salvo que tienen los argumentos implícitos memory_order de memory_order_seq_cst.

Nombre Descripción
atomic_compare_exchange_strong Realiza una atomic compare and exchange operación.
atomic_compare_exchange_strong_explicit Realiza una atomic compare and exchange operación.
atomic_compare_exchange_weak Realiza una weak atomic compare and exchange operación.
atomic_compare_exchange_weak_explicit Realiza una weak atomic compare and exchange operación.
atomic_exchange Reemplaza un valor almacenado.
atomic_exchange_explicit Reemplaza un valor almacenado.
atomic_fetch_add Agrega un valor especificado a un valor almacenado existente.
atomic_fetch_add_explicit Agrega un valor especificado a un valor almacenado existente.
atomic_fetch_and Realiza una operación "and" (&) bit a bit sobre un valor especificado y un valor almacenado existente.
atomic_fetch_and_explicit Realiza una operación "and" (&) bit a bit sobre un valor especificado y un valor almacenado existente.
atomic_fetch_or Realiza una operación "or" (|) bit a bit sobre un valor especificado y un valor almacenado existente.
atomic_fetch_or_explicit Realiza una operación "or" (|) bit a bit sobre un valor especificado y un valor almacenado existente.
atomic_fetch_sub Resta un valor especificado de un valor almacenado existente.
atomic_fetch_sub_explicit Resta un valor especificado de un valor almacenado existente.
atomic_fetch_xor Realiza una operación "exclusive or" (^) bit a bit sobre un valor especificado y un valor almacenado existente.
atomic_fetch_xor_explicit Realiza una operación "exclusive or" (^) bit a bit sobre un valor especificado y un valor almacenado existente.
atomic_flag_clear Establece la marca de un objeto atomic_flag en false.
atomic_flag_clear_explicit Establece la marca de un objeto atomic_flag en false.
atomic_flag_test_and_set Establece la marca de un objeto atomic_flag en true.
atomic_flag_test_and_set_explicit Establece la marca de un objeto atomic_flag en true.
atomic_init Establece el valor almacenado en un objeto atomic.
atomic_is_lock_free Especifica si las operaciones atómicas sobre un objeto especificado no tienen bloqueos.
atomic_load Recupera de forma atómica un valor.
atomic_load_explicit Recupera de forma atómica un valor.
atomic_signal_fence Actúa como una barrera (fence) que establece requisitos de ordenación de memoria entre barreras de un subproceso que llamada cuyos controladores de señal se ejecutan en el mismo subproceso.
atomic_store Almacena de forma atómica un valor.
atomic_store_explicit Almacena de forma atómica un valor.
atomic_thread_fence Actúa como una barrera (fence) que establece requisitos de ordenación de memoria con respecto a otras barreras.
kill_dependency Rompe una posible cadena de dependencia.

Consulte también

Referencia de archivos de encabezado
Referencia de biblioteca estándar de C++