std::atomic_...<std::shared_ptr>
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, | (3) | (desde C++11) (en desuso en C++20) |
template<class T > void atomic_store(std::shared_ptr<T>* p, | (4) | (desde C++11) (en desuso en C++20) |
template<class T > void atomic_store_explicit(std::shared_ptr<T>* p, | (5) | (desde C++11) (en desuso en C++20) |
template<class T > std::shared_ptr<T> atomic_exchange(std::shared_ptr<T>* p, | (6) | (desde C++11) (en desuso en C++20) |
template<class T> std::shared_ptr<T> atomic_exchange_explicit(std::shared_ptr<T>* p, | (7) | (desde C++11) (en desuso en C++20) |
template<class T > bool atomic_compare_exchange_weak(std::shared_ptr<T>* p, | (8) | (desde C++11) (en desuso en C++20) |
template<class T> bool atomic_compare_exchange_strong(std::shared_ptr<T>* p, | (9) | (desde C++11) (en desuso en C++20) |
template<class T > bool atomic_compare_exchange_strong_explicit(std::shared_ptr<T>* p, | (10) | (desde C++11) (en desuso en C++20) |
template<class T > bool atomic_compare_exchange_weak_explicit(std::shared_ptr<T>* p, | (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.
p
está libre de bloqueo.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.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.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.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.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
[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
Esta sección está incompleta Razón: sin 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
(C++11) | Comprueba si las operaciones del tipo atómico son sin bloqueo. (plantilla de función) |
(C++11)(C++11) | Sustituye atómicamente el valor del objeto atómico con el de un argumento no atómico. (plantilla de función) |
(C++11)(C++11) | Obtiene atómicamente el valor almacenado en un objeto atómico. (plantilla de función) |
(C++11)(C++11) | 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) |
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) |