Namespaces
Variants

std:: atomic_ref

From cppreference.net
Concurrency support library
Threads
(C++11)
(C++20)
this_thread namespace
(C++11)
(C++11)
Cooperative cancellation
Mutual exclusion
Generic lock management
Condition variables
(C++11)
Semaphores
Latches and Barriers
(C++20)
(C++20)
Futures
(C++11)
(C++11)
(C++11)
Safe reclamation
Hazard pointers
Atomic types
(C++11)
atomic_ref
(C++20)
Initialization of atomic types
(C++11) (deprecated in C++20)
(C++11) (deprecated in C++20)
Memory ordering
(C++11) (deprecated in C++26)
Free functions for atomic operations
Free functions for atomic flags
Definido en el encabezado <atomic>
template < class T >
struct atomic_ref ;
(desde C++20)

La std::atomic_ref plantilla de clase aplica operaciones atómicas al objeto al que hace referencia.

Durante la vida útil del objeto std::atomic_ref , el objeto al que hace referencia se considera un objeto atómico. Si un hilo escribe en un objeto atómico mientras otro hilo lo lee, el comportamiento está bien definido (consulte el modelo de memoria para más detalles sobre carreras de datos). Además, los accesos a objetos atómicos pueden establecer sincronización entre hilos y ordenar accesos a memoria no atómicos según lo especificado por std::memory_order .

La duración de un objeto debe exceder la duración de todas las std::atomic_ref que referencian al objeto. Mientras exista cualquier instancia de std::atomic_ref que referencie un objeto, el objeto debe ser accedido exclusivamente a través de estas instancias de std::atomic_ref . Ningún subobjeto de un objeto referenciado por un objeto std::atomic_ref puede ser concurrentemente referenciado por ningún otro objeto std::atomic_ref .

Las operaciones atómicas aplicadas a un objeto a través de un std::atomic_ref son atómicas con respecto a las operaciones atómicas aplicadas a través de cualquier otro std::atomic_ref que referencie el mismo objeto.

Al igual que las references en el lenguaje central, la constancia es superficial para std::atomic_ref - es posible modificar el valor referenciado a través de un objeto const std::atomic_ref .

Si se satisface cualquiera de las siguientes condiciones, el programa está mal formado:

std::atomic_ref es CopyConstructible .

Contenidos

Tipos anidados

Tipo Definición
value_type std:: remove_cv_t < T >
difference_type
  • value_type , si T es un tipo aritmético diferente de cv bool .
  • En caso contrario, std::ptrdiff_t , si T es un tipo puntero-a-objeto.
  • En caso contrario, no definido.

Miembros de datos

Miembro Descripción
T * ptr el puntero al objeto referenciado
( objeto miembro solo para exposición* )
indica que el tipo es siempre libre de bloqueo
(constante miembro estática pública)
indica la alineación requerida de un objeto para ser referenciado por atomic_ref
(constante miembro estática pública)

Funciones miembro

construye un objeto atomic_ref
(función miembro pública)
almacena un valor en el objeto referenciado por un atomic_ref objeto
(función miembro pública)
verifica si el objeto atomic_ref es libre de bloqueo
(función miembro pública)
reemplaza atómicamente el valor del objeto referenciado con un argumento no atómico
(función miembro pública)
obtiene atómicamente el valor del objeto referenciado
(función miembro pública)
carga un valor desde el objeto referenciado
(función miembro pública)
reemplaza atómicamente el valor del objeto referenciado y obtiene el valor mantenido previamente
(función miembro pública)
compara atómicamente el valor del objeto referenciado 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)
bloquea el hilo hasta que sea notificado y el valor atómico cambie
(función miembro pública)
notifica al menos un hilo esperando en el objeto atómico
(función miembro pública)
notifica a todos los hilos bloqueados esperando en el objeto atómico
(función miembro pública)
(C++26)
devuelve la dirección del objeto
(función miembro pública)
Proporcionado solo cuando T es un tipo aritmético distinto de cv bool o un tipo pointer-to-object
agrega atómicamente el argumento al valor almacenado en el objeto referenciado y obtiene el valor mantenido previamente
(función miembro pública)
resta atómicamente el argumento del valor almacenado en el objeto referenciado y obtiene el valor mantenido previamente
(función miembro pública)
agrega o resta atómicamente al valor referenciado
(función miembro pública)
Proporcionado solo cuando T es un tipo integral distinto de cv bool o un tipo puntero-a-objeto
(C++26)
realiza atómicamente std::max entre el argumento y el valor del objeto referenciado y obtiene el valor mantenido previamente
(función miembro pública)
(C++26)
realiza atómicamente std::min entre el argumento y el valor del objeto referenciado y obtiene el valor mantenido previamente
(función miembro pública)
incrementa o decrementa atómicamente el objeto referenciado en uno
(función miembro pública)
Proporcionado solo cuando T es un tipo integral distinto de cv bool
realiza atómicamente una operación AND a nivel de bits entre el argumento y el valor del objeto referenciado y obtiene el valor mantenido previamente
(función miembro pública)
realiza atómicamente una operación OR a nivel de bits entre el argumento y el valor del objeto referenciado y obtiene el valor mantenido previamente
(función miembro pública)
realiza atómicamente la operación XOR a nivel de bits entre el argumento y el valor del objeto referenciado y obtiene el valor mantenido previamente
(función miembro pública)
realiza atómicamente operaciones AND, OR, XOR a nivel de bits con el valor referenciado
(función miembro pública)

Especializaciones

La norma especifica que std::atomic_ref tiene las siguientes especializaciones:

template <>
struct atomic_ref < /*integral-type*/ > ;
(1) (desde C++20)
template <>
struct atomic_ref < /*floating-point-type*/ > ;
(2) (desde C++20)
template < class /*pointer-type*/ >

requires /* ver más abajo */

struct atomic_ref < /*pointer-type*/ > ;
(3) (desde C++20)
1) /*integral-type*/ denota un tipo integral posiblemente calificado con cv que no sea cv bool .
2) /*floating-point-type*/ denota un tipo de punto flotante posiblemente calificado con cv.
3) La especialización parcial se proporciona para tipos /*pointer-type*/ que son tipos de puntero-a-objeto posiblemente calificados cv.

Notas

Las implementaciones pueden fusionar las especializaciones especificadas. Por ejemplo, MSVC STL fusiona todas ellas en la plantilla principal.

Cuando T es cv void o un tipo de función, std :: atomic_ref < T * > (es decir, std :: atomic_ref < void * > , std :: atomic_ref < int ( * ) ( ) > etc.) no tiene difference_type ni ninguna operación que requiera aritmética de punteros o comparación relacional (desde C++26) .

Macro de prueba de características Valor Estándar Característica
__cpp_lib_atomic_ref 201806L (C++20) std::atomic_ref
__cpp_lib_constexpr_atomic 202411L (C++26) constexpr std::atomic y std::atomic_ref

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 3508
( P3323R1 )
C++20 atomic_ref < T > tenía operaciones no implementables
si T es un tipo const o tipo puntero-a-no-objeto
estas operaciones están restringidas
o no se proporcionan para T no adecuado

Véase también

(C++11)
plantilla de clase atomic y especializaciones para bool, integral, floating-point, (since C++20) y tipos de puntero
(plantilla de clase)