std::atomic_ref
Definido en el archivo de encabezado <atomic> | ||
template<class T > struct atomic_ref; | (1) | (desde C++20) |
template<class T > struct atomic_ref<T*>; | (2) | (desde C++20) |
La plantilla de clase referencia atómica,std::atomic_ref
, aplica operaciones atómicas al objeto al que hace referencia. Durante el tiempo de vida del objeto atomic_ref
, el objeto al que se hace referencia se considera un objeto atómico. Si un hilo escribe a un objeto atómico mientras otro hilo lee de él, el comportamiento está bien definido (véase modelo de memoria para detalles sobre carreras de datos). Además, accesos a objetos atómicos pueden establecer sincronización intrahilos y ordenar accesos a memoria no atómicos como se especifica en std::memory_order.
El tiempo de vida de un objeto debe exceder el tiempo de vida de todas las referencias atómicas que hacen referencia al objeto. Siempre y cuando existan instancias atomic_ref
que hagan referencia a un objeto, tal objeto debe accederse exclusivamente a través de estas instancias. Ningún subobjeto al que se hace referencia mediante una referencia atómica puede hacerse referencia concurrentemente por otra referencia atómica.
Las operaciones atómicas aplicadas a un objeto a través de una referencia atómica son atómicas con respecto a las operaciones atómicas aplicadas a través de cualquier otra referencia atómica que hacen referencia al mismo objeto.
std::atomic_ref
es CopyConstructible.
De manera similar a las referencias del lenguaje C++, la constantitud de atomic_ref
es superficial. Es posible modificar el valor referenciado a través de un objeto const
atomic_ref
.
Contenido |
[editar]Especializaciones
[editar]Plantilla primaria
La plantilla primaria std::atomic_ref
puede instanciarse con cualquier tipo T
TriviallyCopyable (incluyendo bool):
struct Contadores {int a;int b;} contador;// tipo trivialmente copiable definido por el usuario std::atomic_ref<Contadores> cnt(contador);// especialización para el tipo definido por el usuario
[editar]Especialización parcial para tipos puntero
La biblioteca estándar proporciona especializaciones parciales de la plantilla std::atomic_ref
para todos los tipos puntero. Además de las operaciones proporcionadas para todos los tipos atómicos, estas especializaciones soportan adicionalmente operaciones atómicas aritméticas apropiadas para los tipos punteros, tales como fetch_add
y fetch_sub
.
[editar]Especializaciones para tipos enteros
Al instanciarse con cualquiera de los siguientes tipos enteros, std::atomic_ref
proporciona operaciones atómicas adicionales apropiadas para los tipos enteros, tales como fetch_add
, fetch_sub
, fetch_and
, fetch_or
y fetch_xor
:
- Los tipos carácter char, char8_t, char16_t, char32_t, y wchar_t;
- Los tipos estándar enteros con signo: signedchar, short, int, long, y longlong;
- Los tipos estándar enteros sin signo: unsignedchar, unsignedshort, unsignedint, unsignedlong, y unsignedlonglong;
- Cualquier tipo adicional entero que se necesita por las definiciones de tipo (typedef) en el archivo de encabezado <cstdint>.
La aritmética de enteros con signo usa complemento a dos; no existen resultados indefinidos.
[editar]Especializaciones para tipos de punto flotante
Al instanciarse con uno de los tipos de punto flotante float, double, y longdouble, std::atomic_ref
proporciona operaciones atómicas adicionales apropiadas para tipos flotantes, tales como fetch_add
y fetch_sub
.
Ninguna operación resulta en comportamiento indefinido incluso si el resultado no es representable en el tipo de punto flotante. El entorno de punto flotante en efecto puede ser diferente del entorno de punto flotante del hilo que efectúa la llamada.
[editar]Tipos miembro
Tipo miembro | Definición |
value_type | véase abajo |
difference_type | value_type (Solo para especializaciones atomic_ref<Entero> y atomic_ref<Flotante> )std::ptrdiff_t(Solo para especializaciones atomic_ref<T*> ) |
Para cada std::atomic_ref<X>
(esté especializada o no), std::atomic_ref<X>::value_type
es X
.
difference_type
no está definido en la plantilla primaria atomic_ref
.
[editar]Funciones miembro
Construye un objeto atomic_ref . (función miembro pública) | |
Almacena un valor en un objeto al que se hace referencia por un objeto atomic_ref . (función miembro pública) | |
Comprueba si el objeto atomic_ref está libre de bloqueos. (función miembro pública) | |
Reemplaza atómicamente el valor del objeto al que se hace referencia con un argumento no atómico. (función miembro pública) | |
Obtiene atómicamente el valor del objeto al que se hace referencia. (función miembro pública) | |
Carga un valor desde el objeto al que se hace referencia. (función miembro pública) | |
Reemplaza atómicamente el valor del objeto al que se hace referencia y obtiene el valor previamente albergado. (función miembro pública) | |
Compara atómicamente el valor del objeto al que se hace referencia con el argumento no atómico y realiza un intercambio atómico si son iguales, o una carga atómica si no lo son. (función miembro pública) | |
(C++20) | Bloquea el hilo hasta que se notifique y el valor atómico cambie. (función miembro pública) |
(C++20) | Notifica al menos a un hilo/subproceso esperando al objeto atómico. (función miembro pública) |
(C++20) | Notifica a todos los hilos/subprocesos bloqueados esperando al objeto atómico. (función miembro pública) |
Constantes | |
[estático] | Indica que el tipo siempre está libre de bloqueos. (constante miembro pública estática) |
[estático] | Indica la alineación requerida de un objeto a que se va a hacer referencia por atomic_ref . (constante miembro pública estática) |
[editar]Funciones miembro especializadas
Suma atómicamente el argumento al valor almacenado en el objeto al que se hace referencia y obtiene el valor previamente albergado. (función miembro pública) | |
Resta atómicamente el argumento del valor almacenado en el objeto al que se hace referencia y obtiene el valor previamente albergado. (función miembro pública) | |
Realiza atómicamente una operación AND de bits entre el argumento y el valor del objeto al que se hace referencia y obtiene el valor previamente albergado. (función miembro pública) | |
Realiza atómicamente una operación OR de bits entre el argumento y el valor del objeto al que se hace referencia y obtiene el valor previamente albergado. (función miembro pública) | |
Realiza atómicamente una operación XOR de bits entre el argumento y el valor del objeto al que se hace referencia y obtiene el valor previamente albergado. (función miembro pública) | |
Atómicamente incrementa o decrementa el objeto al que se hace referencia en uno. (función miembro pública) | |
Atómicamente suma, resta o realiza una operación de bits AND, OR o XOR con el valor al que se hace referencia. (función miembro pública) |
[editar]Véase también
(C++11) | Plantilla de clase atómica y especializaciones para los tipos bool , enteros y tipos puntero. (plantilla de clase) |