<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 Name |
---|---|
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. |
Funciones
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++