Espacios de nombres
Variantes
Acciones

std::atomic_ref

De cppreference.com
< cpp‎ | atomic
 
 
 
 
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 constatomic_ref.

Contenido

[editar]Especializaciones

[editar]Plantilla primaria

La plantilla primaria std::atomic_ref puede instanciarse con cualquier tipo TTriviallyCopyable (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_typevéase abajo
difference_typevalue_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)[editar]
Almacena un valor en un objeto al que se hace referencia por un objeto atomic_ref.
(función miembro pública)[editar]
Comprueba si el objeto atomic_ref está libre de bloqueos.
(función miembro pública)[editar]
Reemplaza atómicamente el valor del objeto al que se hace referencia con un argumento no atómico.
(función miembro pública)[editar]
Obtiene atómicamente el valor del objeto al que se hace referencia.
(función miembro pública)[editar]
Carga un valor desde el objeto al que se hace referencia.
(función miembro pública)[editar]
Reemplaza atómicamente el valor del objeto al que se hace referencia y obtiene el valor previamente albergado.
(función miembro pública)[editar]
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)[editar]
(C++20)
Bloquea el hilo hasta que se notifique y el valor atómico cambie.
(función miembro pública)[editar]
(C++20)
Notifica al menos a un hilo/subproceso esperando al objeto atómico.
(función miembro pública)[editar]
(C++20)
Notifica a todos los hilos/subprocesos bloqueados esperando al objeto atómico.
(función miembro pública)[editar]

Constantes

Indica que el tipo siempre está libre de bloqueos.
(constante miembro pública estática)[editar]
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]

[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)[editar]
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)[editar]
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)[editar]
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)[editar]
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)[editar]
Atómicamente incrementa o decrementa el objeto al que se hace referencia en uno.
(función miembro pública)[editar]
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]

[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)[editar]
close