Estructura atomic
Describe un objeto que realiza operaciones atomic
sobre un valor almacenado del tipo Ty
.
Sintaxis
template <class Ty>
struct atomic;
Miembros
Miembro | Descripción |
---|---|
Constructor | |
atomic |
Construye un objeto atómico. |
Operadores | |
atomic::operator Ty |
Lee y devuelve el valor almacenado. (atomic::load ) |
atomic::operator= |
Utiliza un valor especificado para reemplazar el valor almacenado. (atomic::store ) |
atomic::operator++ |
Incrementa el valor almacenado. Solo lo utilizan las especializaciones de entero y de puntero. |
atomic::operator+= |
Suma un valor especificado al valor almacenado. Solo lo utilizan las especializaciones de entero y de puntero. |
atomic::operator-- |
Disminuye el valor almacenado. Solo lo utilizan las especializaciones de entero y de puntero. |
atomic::operator-= |
Resta un valor especificado del valor almacenado. Solo lo utilizan las especializaciones de entero y de puntero. |
atomic::operator&= |
Realiza una operación bit a bit "and" (& ) sobre un valor especificado y el valor almacenado. Solo lo utilizan las especializaciones de entero. |
atomic::operator|= |
Realiza una operación bit a bit "or" (| ) sobre un valor especificado y el valor almacenado. Solo lo utilizan las especializaciones de entero. |
atomic::operator^= |
Realiza una operación bit a bit "exclusive or" (^ ) sobre un valor especificado y el valor almacenado. Solo lo utilizan las especializaciones de entero. |
Funciones | |
compare_exchange_strong |
Realiza una operación atomic_compare_and_exchange sobre this y devuelve el resultado. |
compare_exchange_weak |
Realiza una operación weak_atomic_compare_and_exchange sobre this y devuelve el resultado. |
fetch_add |
Suma un valor especificado al valor almacenado. |
fetch_and |
Realiza una operación bit a bit "and" (& ) sobre un valor especificado y el valor almacenado. |
fetch_or |
Realiza una operación bit a bit "or" (| ) sobre un valor especificado y el valor almacenado. |
fetch_sub |
Resta un valor especificado del valor almacenado. |
fetch_xor |
Realiza una operación bit a bit "exclusive or" (^ ) sobre un valor especificado y el valor almacenado. |
is_lock_free |
Especifica si las operaciones atomic en this no tienen bloqueos. Un tipo atomic no tiene bloqueos si ninguna operación atomic sobre ese tipo emplea bloqueos. |
load |
Lee y devuelve el valor almacenado. |
store |
Utiliza un valor especificado para reemplazar el valor almacenado. |
Comentarios
El tipo Ty
se debe poder copiar de forma trivial. Es decir, el uso de memcpy
para copiar sus bytes debe generar un objeto Ty
válido que sea igual que el objeto original. Las funciones miembro compare_exchange_weak
y compare_exchange_strong
usan memcmp
para determinar si dos valores Ty
son iguales. Estas funciones no utilizarán un Ty
definido por operator==
. Las funciones miembro de atomic
utilizan memcpy
para copiar valores de tipo Ty
.
Existe una especialización parcial, atomic<Ty*>
, para todos los tipos de puntero. La especialización permite sumar un desplazamiento al valor del puntero administrado o restar un desplazamiento del mismo. Las operaciones aritméticas toman un argumento de tipo ptrdiff_t
y ajustan ese argumento según el tamaño de Ty
para que sea coherente con la aritmética normal de dirección.
Existe una especialización para cada tipo entero excepto bool
. Cada especialización proporciona un conjunto completo de métodos para operaciones aritméticas y lógicas atómicas.
atomic<char>
atomic<signed char>
atomic<unsigned char>
atomic<char16_t>
atomic<char32_t>
atomic<wchar_t>
atomic<short>
atomic<unsigned short>
atomic<int>
atomic<unsigned int>
atomic<long>
atomic<unsigned long>
atomic<long long>
atomic<unsigned long long>
Las especializaciones de entero se derivan de los tipos atomic_integral
correspondientes. Por ejemplo, atomic<unsigned int>
se deriva de atomic_uint
.
Requisitos
Encabezado: <atomic>
Espacio de nombres: std
atomic::atomic
Construye un objeto atómico.
atomic();
atomic( const atomic& );
atomic( Ty Value ) noexcept;
Parámetros
Value
Valor de inicialización.
Comentarios
Los objetos atómicos no se pueden copiar o mover.
Los objetos que son creaciones de instancias de atomic<Ty>
solo los puede inicializar el constructor que toma un argumento de tipo Ty
y no mediante la inicialización de agregado. Sin embargo, los objetos atomic_integral
solo se pueden inicializar mediante la inicialización de agregado.
atomic<int> ai0 = ATOMIC_VAR_INIT(0);
atomic<int> ai1(0);
atomic::operator Ty
Operador del tipo especificado en la plantilla, atomic<Ty>
. Recupera el valor almacenado en *this
.
atomic<Ty>::operator Ty() const volatile noexcept;
atomic<Ty>::operator Ty() const noexcept;
Comentarios
Este operador aplica el memory_order_seq_cst
memory_order
.
atomic::operator=
Almacena un valor especificado.
Ty operator=(
Ty Value
) volatile noexcept;
Ty operator=(
Ty Value
) noexcept;
Parámetros
Value
Un objeto Ty
.
Valor devuelto
Devuelve Value
.
atomic::operator++
Incrementa el valor almacenado. Solo lo utilizan las especializaciones de entero y de puntero.
Ty atomic<Ty>::operator++(int) volatile noexcept;
Ty atomic<Ty>::operator++(int) noexcept;
Ty atomic<Ty>::operator++() volatile noexcept;
Ty atomic<Ty>::operator++() noexcept;
Valor devuelto
Los dos primeros operadores devuelven el valor incrementado; los dos últimos operadores devuelven el valor antes del incremento. Los operadores usan .memory_order_seq_cst
memory_order
atomic::operator+=
Suma un valor especificado al valor almacenado. Solo lo utilizan las especializaciones de entero y de puntero.
Ty atomic<Ty>::operator+=(
Ty Value
) volatile noexcept;
Ty atomic<Ty>::operator+=(
Ty Value
) noexcept;
Parámetros
Value
Valor integral o de puntero.
Valor devuelto
Objeto Ty
que contiene el resultado de la suma.
Comentarios
Este operador usa .memory_order_seq_cst
memory_order
atomic::operator--
Disminuye el valor almacenado. Solo lo utilizan las especializaciones de entero y de puntero.
Ty atomic<Ty>::operator--(int) volatile noexcept;
Ty atomic<Ty>::operator--(int) noexcept;
Ty atomic<Ty>::operator--() volatile noexcept;
Ty atomic<Ty>::operator--() noexcept;
Valor devuelto
Los dos primeros operadores devuelven el valor reducido; los dos últimos operadores devuelven el valor antes de la reducción. Los operadores usan .memory_order_seq_cst
memory_order
atomic::operator-=
Resta un valor especificado del valor almacenado. Solo lo utilizan las especializaciones de entero y de puntero.
Ty atomic<Ty>::operator-=(
Ty Value
) volatile noexcept;
Ty atomic<Ty>::operator-=(
Ty Value
) noexcept;
Parámetros
Value
Valor integral o de puntero.
Valor devuelto
Objeto Ty
que contiene el resultado de la resta.
Comentarios
Este operador usa .memory_order_seq_cst
memory_order
atomic::operator&=
Realiza una operación bit a bit "and" (&
) sobre un valor especificado y el valor almacenado de *this
. Solo lo utilizan las especializaciones de entero.
atomic<Ty>::operator&= (
Ty Value
) volatile noexcept;
atomic<Ty>::operator&= (
Ty Value
) noexcept;
Parámetros
Value
Valor de tipo Ty
.
Valor devuelto
El resultado de "and" bit a bit (&
).
Comentarios
Este operador realiza una operación de lectura-modificación-escritura para reemplazar el valor almacenado de *this
por un valor "and" bit a bit (&
) de Value
y el valor actual almacenado en *this
, dentro de las restricciones de memory_order_seq_cst
memory_order
.
atomic::operator|=
Realiza una operación bit a bit "or" (|
) sobre un valor especificado y el valor almacenado de *this
. Solo lo utilizan las especializaciones de entero.
atomic<Ty>::operator|= (
Ty Value
) volatile noexcept;
atomic<Ty>::operator|= (
Ty Value
) noexcept;
Parámetros
Value
Valor de tipo Ty
.
Valor devuelto
Resultado de la operación bit a bit "or" (|
).
Comentarios
Este operador realiza una operación de lectura-modificación-escritura para reemplazar el valor almacenado de *this
por un valor bit a bit "o" (|
) de Value
y el valor actual almacenado en *this
, dentro de las restricciones de las memory_order_seq_cst
memory_order
restricciones.
atomic::operator^=
Realiza una operación bit a bit "exclusive or" (^
) sobre un valor especificado y el valor almacenado de *this
. Solo lo utilizan las especializaciones de entero.
atomic<Ty>::operator^= (
Ty Value
) volatile noexcept;
atomic<Ty>::operator^= (
Ty Value
) noexcept;
Parámetros
Value
Valor de tipo Ty
.
Valor devuelto
Resultado de la operación bit a bit "exclusive or" (^
).
Comentarios
Este operador realiza una operación de lectura-modificación-escritura para reemplazar el valor almacenado de *this
por un valor "exclusivo" bit a bit (^
) de Value
y el valor actual almacenado en *this
, dentro de las restricciones de las memory_order_seq_cst
memory_order
restricciones.
atomic::compare_exchange_strong
Realiza una operación atómica de comparación e intercambio sobre *this
.
bool compare_exchange_strong(
Ty& Exp,
Ty Value,
memory_order Order1,
memory_order Order2
) volatile noexcept;
bool compare_exchange_strong(
Ty& Exp,
Ty Value,
memory_order Order1,
memory_order Order2
) noexcept;
bool compare_exchange_strong(
Ty& Exp,
Ty Value,
memory_order Order1 = memory_order_seq_cst
) volatile noexcept;
bool compare_exchange_strong(
Ty& Exp,
Ty Value,
memory_order Order1 = memory_order_seq_cst
) noexcept;
Parámetros
Exp
Valor de tipo Ty
.
Value
Valor de tipo Ty
.
Order1
Primer argumento memory_order
.
Order2
Segundo argumento memory_order
.
Valor devuelto
Número bool
que indica el resultado de la comparación de valores.
Comentarios
Esta operación atómica de comparación e intercambio compara el valor almacenado en *this
con Exp
. Si los valores son iguales, la operación reemplaza el valor almacenado en *this
con Value
mediante una operación de lectura-modificación-escritura y aplicando las restricciones de ordenación de memoria especificadas por Order1
. Si los valores no son iguales, la operación utiliza el valor almacenado en *this
para reemplazar Exp
y aplica las restricciones de ordenación de memoria especificadas por Order2
.
Las sobrecargas que no tienen un segundo memory_order
usan un Order2
implícito basado en el valor de Order1
. Si Order1
es memory_order_acq_rel
, Order2
es memory_order_acquire
. Si Order1
es memory_order_release
, Order2
es memory_order_relaxed
. En todos los demás casos, Order2
es igual que Order1
.
Para las sobrecargas que toman dos parámetros memory_order
, el valor de Order2
no debe ser memory_order_release
o memory_order_acq_rel
, y no debe ser más seguro que el valor de Order1
.
atomic::compare_exchange_weak
Realiza una operación atómica débil de comparación e intercambio sobre *this
.
bool compare_exchange_weak(
Ty& Exp,
Ty Value,
memory_order Order1,
memory_order Order2
) volatile noexcept;
bool compare_exchange_weak(
Ty& Exp,
Ty Value,
memory_order Order1,
memory_order Order2
) noexcept;
bool compare_exchange_weak(
Ty& Exp,
Ty Value,
memory_order Order1 = memory_order_seq_cst
) volatile noexcept;
bool compare_exchange_weak(
Ty& Exp,
Ty Value,
memory_order Order1 = memory_order_seq_cst
) noexcept;
Parámetros
Exp
Valor de tipo Ty
.
Value
Valor de tipo Ty
.
Order1
Primer argumento memory_order
.
Order2
Segundo argumento memory_order
.
Valor devuelto
Número bool
que indica el resultado de la comparación de valores.
Comentarios
Esta operación atómica de comparación e intercambio compara el valor almacenado en *this
con Exp
. Si los valores son iguales, la operación reemplaza el valor almacenado en *this
con Value
mediante una operación de lectura-modificación-escritura y aplicando las restricciones de ordenación de memoria especificadas por Order1
. Si los valores no son iguales, la operación utiliza el valor almacenado en *this
para reemplazar Exp
y aplica las restricciones de ordenación de memoria especificadas por Order2
.
Una operación atómica débil de comparación e intercambio realiza un intercambio si los valores comparados son iguales. Si los valores no son iguales, no se garantiza que la operación realice un intercambio.
Las sobrecargas que no tienen un segundo memory_order
usan un Order2
implícito basado en el valor de Order1
. Si Order1
es memory_order_acq_rel
, Order2
es memory_order_acquire
. Si Order1
es memory_order_release
, Order2
es memory_order_relaxed
. En todos los demás casos, Order2
es igual que Order1
.
Para las sobrecargas que toman dos parámetros memory_order
, el valor de Order2
no debe ser memory_order_release
o memory_order_acq_rel
, y no debe ser más seguro que el valor de Order1
.
atomic::exchange
Utiliza un valor especificado para reemplazar el valor almacenado de *this
.
Ty atomic<Ty>::exchange(
Ty Value,
memory_order Order = memory_order_seq_cst
) volatile noexcept;
Ty atomic<Ty>::exchange(
Ty Value,
memory_order Order = memory_order_seq_cst
) noexcept;
Parámetros
Value
Valor de tipo Ty
.
Order
Un objeto memory_order
.
Valor devuelto
Valor almacenado de *this
antes del intercambio.
Comentarios
Esta operación realiza una operación de lectura-modificación-escritura para utilizar Value
para reemplazar el valor almacenado en *this
, dentro de las restricciones de memoria especificadas por Order
.
atomic::fetch_add
Captura el valor almacenado en *this
y, a continuación, agrega un valor especificado al valor almacenado.
Ty atomic<Ty>::fetch_add (
Ty Value,
memory_order Order = memory_order_seq_cst
) volatile noexcept;
Ty atomic<Ty>::fetch_add (
Ty Value,
memory_order Order = memory_order_seq_cst
) noexcept;
Parámetros
Value
Valor de tipo Ty
.
Order
Un objeto memory_order
.
Valor devuelto
Objeto Ty
que contiene el valor almacenado en *this
antes de la adición.
Comentarios
El método fetch_add
realiza una operación de lectura-modificación-escritura para sumar Value
de forma atómica al valor almacenado en *this
, y aplica las restricciones de memoria especificadas por Order
.
atomic::fetch_and
Realiza una operación "and" bit a bit (&
) sobre un valor y un valor existente que está almacenado en *this
.
Ty atomic<Ty>::fetch_and (
Ty Value,
memory_order Order = memory_order_seq_cst
) volatile noexcept;
Ty atomic<Ty>::fetch_and (
Ty Value,
memory_order Order = memory_order_seq_cst
) noexcept;
Parámetros
Value
Valor de tipo Ty
.
Order
Un objeto memory_order
.
Valor devuelto
Objeto Ty
que contiene el resultado de la operación "and" bit a bit (&
).
Comentarios
El método fetch_and
realiza una operación de lectura-modificación-escritura para reemplazar el valor almacenado de *this
con una operación "and" bit a bit (&
) de Value
y el valor actual almacenado en *this
, dentro de las restricciones de memoria especificadas por Order
.
atomic::fetch_or
Realiza una operación "or" bit a bit (|
) sobre un valor y un valor existente que está almacenado en *this
.
Ty atomic<Ty>::fetch_or (
Ty Value,
memory_order Order = memory_order_seq_cst
) volatile noexcept;
Ty atomic<Ty>::fetch_or (
Ty Value,
memory_order Order = memory_order_seq_cst
) noexcept;
Parámetros
Value
Valor de tipo Ty
.
Order
Un objeto memory_order
.
Valor devuelto
Objeto Ty
que contiene el resultado de la operación "or" bit a bit (|
).
Comentarios
El método fetch_or
realiza una operación de lectura-modificación-escritura para reemplazar el valor almacenado de *this
con una operación "or" bit a bit (|
) de Value
y el valor actual almacenado en *this
, dentro de las restricciones de memoria especificadas por Order
.
atomic::fetch_sub
Resta un valor especificado del valor almacenado.
Ty atomic<Ty>::fetch_sub (
Ty Value,
memory_order Order = memory_order_seq_cst
) volatile noexcept;
Ty atomic<Ty>::fetch_sub (
Ty Value,
memory_order Order = memory_order_seq_cst
) noexcept;
Parámetros
Value
Valor de tipo Ty
.
Order
Un objeto memory_order
.
Valor devuelto
Objeto Ty
que contiene el resultado de la resta.
Comentarios
El método fetch_sub
realiza una operación de lectura-modificación-escritura para restar Value
de forma atómica del valor almacenado en *this
, dentro de las restricciones de memoria especificadas por Order
.
atomic::fetch_xor
Realiza una operación "exclusive or" bit a bit (^
) sobre un valor y un valor existente que está almacenado en *this
.
Ty atomic<Ty>::fetch_xor (
Ty Value,
memory_order Order = memory_order_seq_cst
) volatile noexcept;
Ty atomic<Ty>::fetch_xor (
Ty Value,
memory_order Order = memory_order_seq_cst
) noexcept;
Parámetros
Value
Valor de tipo Ty
.
Order
Un objeto memory_order
.
Valor devuelto
Objeto Ty
que contiene el resultado de la operación "exclusive or" bit a bit (^
).
Comentarios
El método fetch_xor
realiza una operación de lectura-modificación-escritura para reemplazar el valor almacenado de *this
con una operación "exclusive or" bit a bit (^
) de Value
y el valor actual almacenado en *this
, y aplica las restricciones de memoria especificadas por Order
.
atomic::is_lock_free
Especifica si las operaciones atomic
en *this
no tienen bloqueos.
bool is_lock_free() const volatile noexcept;
Valor devuelto
true
si las operaciones atomic
en *this
no tienen bloqueos; de lo contrario, false
.
Comentarios
Un tipo atomic
no tiene bloqueos si ninguna operación atomic
sobre ese tipo emplea bloqueos.
atomic::load
Recupera el valor almacenado en *this
, dentro de las restricciones de memoria especificadas.
Ty atomic::load(
memory_order Order = memory_order_seq_cst
) const volatile noexcept;
Ty atomic::load(
memory_order Order = memory_order_seq_cst
) const noexcept;
Parámetros
Order
memory_order
. Order
no debe ser memory_order_release
o memory_order_acq_rel
.
Valor devuelto
Valor recuperado que se almacena en *this
.
atomic::store
Almacena un valor especificado.
void atomic<Ty>::store(
Ty Value,
memory_order Order = memory_order_seq_cst
) volatile noexcept;
void atomic<Ty>::store(
Ty Value,
memory_order Order = memory_order_seq_cst
) noexcept;
Parámetros
Value
Un objeto Ty
.
Order
Una restricción memory_order
.
Comentarios
Este método almacena de forma atómica Value
en *this
, dentro de las restricciones de memoria especificadas por Order
.