std:: atomic_ref
|
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:: is_trivially_copyable_v < T > es false .
-
is_always_lock_freees false y std:: is_volatile_v < T > es true .
std::atomic_ref
es
CopyConstructible
.
Contenidos |
Tipos anidados
| Tipo | Definición |
value_type
|
std:: remove_cv_t < T > |
difference_type
|
|
Miembros de datos
| Miembro | Descripción |
T
*
ptr
|
el puntero al objeto referenciado
( objeto miembro solo para exposición* ) |
|
[static]
|
indica que el tipo es siempre libre de bloqueo
(constante miembro estática pública) |
|
[static]
|
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
|
|
|
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
|
|
|
(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
|
|
|
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 */
|
(3) | (desde C++20) |
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) |