std:: atomic <std::shared_ptr>
|
Definido en el encabezado
<memory>
|
||
|
template
<
class
T
>
struct std:: atomic < std:: shared_ptr < T >> ; |
(desde C++20) | |
La especialización parcial de plantilla de
std::atomic
para
std::
shared_ptr
<
T
>
permite a los usuarios manipular objetos
shared_ptr
de forma atómica.
Si múltiples hilos de ejecución acceden al mismo objeto std::shared_ptr sin sincronización y alguno de esos accesos utiliza una función miembro no constante de shared_ptr entonces ocurrirá una condición de carrera (data race) a menos que todo dicho acceso se realice a través de una instancia de std:: atomic < std:: shared_ptr > (o, en desuso desde C++20, a través de las funciones independientes para acceso atómico a std::shared_ptr ).
Los incrementos asociados de
use_count
están garantizados como parte de la operación atómica. Los decrementos asociados de
use_count
se secuencian después de la operación atómica, pero no se requieren como parte de ella, excepto para el cambio de
use_count
al sobrescribir
expected
en un CAS fallido. Cualquier eliminación y desasignación asociadas se secuencian después del paso de actualización atómica y no forman parte de la operación atómica.
Tenga en cuenta que el bloque de control de un
shared_ptr
es seguro para hilos: diferentes objetos
std::shared_ptr
no atómicos pueden ser accedidos mediante operaciones mutables, como
operator
=
o
reset
, simultáneamente por múltiples hilos, incluso cuando estas instancias son copias y comparten internamente el mismo bloque de control.
El tipo T puede ser un tipo incompleto.
Tipos de miembros
| Tipo de miembro | Definición |
value_type
|
std:: shared_ptr < T > |
Funciones miembro
Todas las funciones no especializadas de std::atomic también están proporcionadas por esta especialización, y no hay funciones miembro adicionales.
|
constexpr
atomic
(
)
noexcept
=
default
;
|
(1) | |
|
constexpr
atomic
(
std::
nullptr_t
)
noexcept
:
atomic
(
)
{
}
|
(2) | |
|
atomic
(
std::
shared_ptr
<
T
>
desired
)
noexcept
;
|
(3) | |
|
atomic
(
const
atomic
&
)
=
delete
;
|
(4) | |
|
void
operator
=
(
const
atomic
&
)
=
delete
;
|
(1) | |
|
void
operator
=
(
std::
shared_ptr
<
T
>
desired
)
noexcept
;
|
(2) | |
|
void
operator
=
(
std::
nullptr_t
)
noexcept
;
|
(3) | |
|
bool
is_lock_free
(
)
const
noexcept
;
|
||
Devuelve true si las operaciones atómicas en todos los objetos de este tipo son libres de bloqueo, false en caso contrario.
|
void
store
(
std::
shared_ptr
<
T
>
desired,
std:: memory_order order = std:: memory_order_seq_cst ) noexcept ; |
||
Reemplaza atómicamente el valor de * this con el valor de desired como si fuera mediante p. swap ( desired ) donde p es el std:: shared_ptr < T > subyacente. La memoria se ordena de acuerdo con order . El comportamiento es indefinido si order es std::memory_order_consume , std::memory_order_acquire , o std::memory_order_acq_rel .
|
std::
shared_ptr
<
T
>
load
(
std::
memory_order
order
=
std::
memory_order_seq_cst
)
const
noexcept
;
|
||
Devuelve atómicamente una copia del puntero compartido subyacente. La memoria se ordena de acuerdo con order . El comportamiento es indefinido si order es std::memory_order_release o std::memory_order_acq_rel .
|
std::
shared_ptr
<
T
>
exchange
(
std::
shared_ptr
<
T
>
desired,
std:: memory_order order = std:: memory_order_seq_cst ) noexcept ; |
||
Reemplaza atómicamente el std:: shared_ptr < T > subyacente con desired como si se hiciera mediante p. swap ( desired ) donde p es el std:: shared_ptr < T > subyacente y devuelve una copia del valor que p tenía inmediatamente antes del intercambio. La memoria se ordena según order . Esta es una operación atómica de lectura-modificación-escritura.
|
bool
compare_exchange_strong
(
std::
shared_ptr
<
T
>
&
expected,
std::
shared_ptr
<
T
>
desired,
std:: memory_order success, std:: memory_order failure ) noexcept ; |
(1) | |
|
bool
compare_exchange_weak
(
std::
shared_ptr
<
T
>
&
expected,
std::
shared_ptr
<
T
>
desired,
std:: memory_order success, std:: memory_order failure ) noexcept ; |
(2) | |
|
bool
compare_exchange_strong
(
std::
shared_ptr
<
T
>
&
expected,
std::
shared_ptr
<
T
>
desired,
std:: memory_order order = std:: memory_order_seq_cst ) noexcept ; |
(3) | |
|
bool
compare_exchange_weak
(
std::
shared_ptr
<
T
>
&
expected,
std::
shared_ptr
<
T
>
desired,
std:: memory_order order = std:: memory_order_seq_cst ) noexcept ; |
(4) | |
use_count
de
expected
es parte de esta operación atómica, aunque la escritura en sí misma (y cualquier desalocación/destrucción posterior) no está obligada a serlo.
fail_order
es igual que
order
excepto que
std::memory_order_acq_rel
se reemplaza por
std::memory_order_acquire
y
std::memory_order_release
se reemplaza por
std::memory_order_relaxed
.
fail_order
es igual que
order
excepto que
std::memory_order_acq_rel
se reemplaza por
std::memory_order_acquire
y
std::memory_order_release
se reemplaza por
std::memory_order_relaxed
.
|
void
wait
(
std::
shared_ptr
<
T
>
old,
std:: memory_order order = std:: memory_order_seq_cst ) const noexcept ; |
||
Realiza una operación de espera atómica.
Compara
load
(
order
)
con
old
y si son equivalentes, se bloquea hasta que
*
this
sea notificado por
notify_one()
o
notify_all()
. Esto se repite hasta que
load
(
order
)
cambie. Esta función garantiza que solo retornará si el valor ha cambiado, incluso si la implementación subyacente se desbloquea espuriamente.
La memoria se ordena de acuerdo con order . El comportamiento es indefinido si order es std::memory_order_release o std::memory_order_acq_rel .
Notas: dos
shared_ptr
son equivalentes si almacenan el mismo puntero y comparten la propiedad o ambos están vacíos.
|
void
notify_one
(
)
noexcept
;
|
||
Realiza una operación de notificación atómica.
Si hay un hilo bloqueado en operaciones de espera atómica (es decir,
wait()
) en
*
this
, entonces desbloquea al menos uno de dichos hilos; de lo contrario no hace nada.
|
void
notify_all
(
)
noexcept
;
|
||
Realiza una operación de notificación atómica.
Desbloquea todos los hilos bloqueados en operaciones de espera atómica (es decir,
wait()
) en
*
this
, si los hay; de lo contrario no hace nada.
Constantes de miembro
La única constante miembro estándar
std::atomic
is_always_lock_free
también es proporcionada por esta especialización.
|
static
constexpr
bool
is_always_lock_free
=
/*implementation-defined*/
;
|
||
Notas
| Macro de prueba de características | Valor | Std | Característica |
|---|---|---|---|
__cpp_lib_atomic_shared_ptr
|
201711L
|
(C++20) |
std::atomic<std::shared_ptr>
|
Ejemplo
|
Esta sección está incompleta
Razón: sin ejemplo |
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 3661 | C++20 |
atomic<shared_ptr<T>>
no era inicializable-constantemente desde
nullptr
|
hecho inicializable-constantemente |
| LWG 3893 | C++20 |
LWG3661
hizo que
atomic<shared_ptr<T>>
no fuera asignable desde
nullptr_t
|
asignabilidad restaurada |
Véase también
|
(C++11)
|
Plantilla de clase atomic y especializaciones para bool, tipos integrales,
tipos de punto flotante,
(desde C++20)
y tipos puntero
(plantilla de clase) |