Espacios de nombres
Variantes
Acciones

std::atomic_...<std::shared_ptr>

De cppreference.com
< cpp‎ | memory‎ | shared ptr
 
 
Biblioteca de servicios
 
Gestión de memoria dinámica
Punteros inteligentes
(C++11)
(C++11)
(C++11)
(hasta C++17)
(C++11)
(C++23)
Asignadores de memoria
Recursos de memoria
Almacenamiento no inicializado
Algoritmos de memoria no inicializada
Algoritmos restringidos de memoria no inicializada
Apoyo para recolección de basura
(C++11)(hasta C++23)
(C++11)(hasta C++23)
(C++11)(hasta C++23)
(C++11)(hasta C++23)
(C++11)(hasta C++23)
(C++11)(hasta C++23)
Misceláneos
(C++20)
(C++11)
(C++11)
 
 
template<class T >
bool atomic_is_lock_free(conststd::shared_ptr<T>* p );
(1) (desde C++11)
(en desuso en C++20)
template<class T >
std::shared_ptr<T> atomic_load(conststd::shared_ptr<T>* p );
(2) (desde C++11)
(en desuso en C++20)
template<class T >

std::shared_ptr<T> atomic_load_explicit(conststd::shared_ptr<T>* p,

                                         std::memory_order mo );
(3) (desde C++11)
(en desuso en C++20)
template<class T >

void atomic_store(std::shared_ptr<T>* p,

                   std::shared_ptr<T> r );
(4) (desde C++11)
(en desuso en C++20)
template<class T >

void atomic_store_explicit(std::shared_ptr<T>* p,
                            std::shared_ptr<T> r,

                            std::memory_order mo);
(5) (desde C++11)
(en desuso en C++20)
template<class T >

std::shared_ptr<T> atomic_exchange(std::shared_ptr<T>* p,

                                    std::shared_ptr<T> r);
(6) (desde C++11)
(en desuso en C++20)
template<class T>

std::shared_ptr<T> atomic_exchange_explicit(std::shared_ptr<T>* p,
                                             std::shared_ptr<T> r,

                                             std::memory_order mo);
(7) (desde C++11)
(en desuso en C++20)
template<class T >

bool atomic_compare_exchange_weak(std::shared_ptr<T>* p,
                                   std::shared_ptr<T>* expected,

                                   std::shared_ptr<T> desired);
(8) (desde C++11)
(en desuso en C++20)
template<class T>

bool atomic_compare_exchange_strong(std::shared_ptr<T>* p,
                                     std::shared_ptr<T>* expected,

                                     std::shared_ptr<T> desired);
(9) (desde C++11)
(en desuso en C++20)
template<class T >

bool atomic_compare_exchange_strong_explicit(std::shared_ptr<T>* p,
                                              std::shared_ptr<T>* expected,
                                              std::shared_ptr<T> desired,
                                              std::memory_order success,

                                              std::memory_order failure);
(10) (desde C++11)
(en desuso en C++20)
template<class T >

bool atomic_compare_exchange_weak_explicit(std::shared_ptr<T>* p,
                                            std::shared_ptr<T>* expected,
                                            std::shared_ptr<T> desired,
                                            std::memory_order success,

                                            std::memory_order failure);
(11) (desde C++11)
(en desuso en C++20)

Si varios hilos de ejecución acceden al mismo objeto std::shared_ptr sin sincronización y cualquiera de esos accesos utiliza una función de miembro no constante de shared_ptr, se producirá una carrera de datos a menos que todos esos accesos se realicen a través de estas funciones, que son sobrecargas de las funciones de acceso atómico correspondientes (std::atomic_load, std::atomic_store, etc.).

Tenga en cuenta que el bloque de control de shared_ptr es seguro para hilos: se puede acceder a diferentes objetos std::shared_ptr mediante operaciones mutables, como operator= o reset, simultáneamente por varios hilos, incluso cuando estas instancias son copias, y comparten el mismo bloque de control internamente.

1) Determina si el acceso atómico al puntero compartido al que apunta p está libre de bloqueo.
2) Equivalente a atomic_load_explicit(p, std::memory_order_seq_cst)
3) Devuelve el puntero compartido al que apunta p. Al igual que con la std::atomic_load_explicit no especializada, mo no puede ser std::memory_order_release o std::memory_order_acq_rel.
4) Equivalente a atomic_store_explicit(p, r, memory_order_seq_cst).
5) Almacena el puntero compartido r en el puntero compartido al que apunta p atómicamente. Efectivamente ejecuta p->swap(r). Al igual que con la std::atomic_store_explicit no especializada, mo no puede ser std::memory_order_acquire o std::memory_order_acq_rel.
6) Equivalente a atomic_exchange_explicit(p, r, memory_order_seq_cst).
7) Almacena el puntero compartido r en el puntero compartido al que apunta p y devuelve el valor al que p apuntaba anteriormente, atómicamente. Efectivamente ejecuta p->swap(r) y devuelve una copia de r después del intercambio.
8) Equivalente a atomic_compare_exchange_weak_explicit(p, expected, desired, std::memory_order_seq_cst, std::memory_order_seq_cst).
9) Equivalente a atomic_compare_exchange_strong_explicit(p, expected, desired, std::memory_order_seq_cst, std::memory_order_seq_cst).
10) Compara los punteros compartidos a los que apuntan p y expected. Si son equivalentes (almacenan el mismo valor de puntero y comparten la posesión del mismo objeto o ambos están vacíos), asigna desired a *p usando las restricciones de ordenamiento de memoria especificadas por success y devuelve true. Si no son equivalentes, asigna *p a *expected usando las restricciones de ordenamiento de memoria especificadas por failure y devuelve false.
11) Igual que (10), pero puede fallar espuriamente.

Todas estas funciones invocan un comportamiento no definido si p es un puntero nulo.

Contenido

[editar]Parámetros

p, expected - Un puntero a un std::shared_ptr.
r, desired - Un std::shared_ptr.
mo, success, failure - Selectores de ordenamiento de memoria de tipo std::memory_order.

[editar]Excepciones

Estas funciones no lanzan excepciones.

[editar]Valor de retorno

1)true si el acceso atómico se implementa utilizando instrucciones libres de bloqueo.
2,3) Una copia del puntero compartido al que se apunta.
4,5) (Ninguno)
6,7) Una copia del puntero compartido al que se apuntaba anteriormente.
8,9,10,11)true si los punteros compartidos eran equivalentes y se realizó el intercambio, false de lo contrario.

[editar]Notas

Estas funciones generalmente se implementan mediante mutexes, almacenadas en una tabla de dispersión (hash) global donde el valor del puntero se usa como clave.

Para evitar carreras de datos, una vez que se pasa un puntero compartido a cualquiera de estas funciones, no se puede acceder a él de forma no atómica. En particular, no se puede desreferenciar tal shared_ptr sin primero cargarlo atómicamente en otro objeto shared_ptr y luego desreferenciarlo a través del segundo objeto.

La Especificación Técnica de Concurrencia ofrece clases de punteros inteligentes atómicos atomic_shared_ptr y atomic_weak_ptr como reemplazo para el uso de estas funciones.

Estas funciones quedaron obsoletas en favor de las especializaciones de la plantilla std::atomic: std::atomic<std::shared_ptr> y std::atomic<std::weak_ptr>.

(desde C++20)

[editar]Ejemplo

[editar]Informes de defectos

Los siguientes informes de defectos de cambio de comportamiento se aplicaron de manera retroactiva a los estándares de C++ publicados anteriormente.

ID Aplicado a Comportamiento según lo publicado Comportamiento correcto
LWG 2980 C++11 Los shared_ptr vacíos nunca son equivalentes. Son equivalentes si almacenan el mismo valor de puntero.

[editar]Véase también

Comprueba si las operaciones del tipo atómico son sin bloqueo.
(plantilla de función)[editar]
Sustituye atómicamente el valor del objeto atómico con el de un argumento no atómico.
(plantilla de función)[editar]
Obtiene atómicamente el valor almacenado en un objeto atómico.
(plantilla de función)[editar]
Reemplaza atómicamente el valor del objeto atómico con el del argumento no atómico y devuelve el valor anterior del objeto atómico.
(plantilla de función)[editar]
Compara atómicamente el valor del objeto atómico con el argumento no atómico y realiza un intercambio atómico si son iguales o una carga atómica si no lo son.
(plantilla de función)[editar]
close