Namespaces
Variants

std::experimental::atomic_weak_ptr<T>:: compare_exchange_strong, std::experimental::atomic_weak_ptr<T>:: compare_exchange_weak

From cppreference.net
bool compare_exchange_weak ( std:: weak_ptr < T > & expected, const std:: weak_ptr < T > & desired,
std:: memory_order success, std:: memory_order failure ) noexcept ;
(1)
bool compare_exchange_weak ( std:: weak_ptr < T > & expected, std:: weak_ptr < T > && desired,
std:: memory_order success, std:: memory_order failure ) noexcept ;
(2)
bool compare_exchange_weak ( std:: weak_ptr < T > & expected, const std:: weak_ptr < T > & desired,
std:: memory_order order = std:: memory_order_seq_cst ) noexcept ;
(3)
bool compare_exchange_weak ( std:: weak_ptr < T > & expected, std:: weak_ptr < T > && desired,
std:: memory_order order = std:: memory_order_seq_cst ) noexcept ;
(4)
bool compare_exchange_strong ( std:: weak_ptr < T > & expected, const std:: weak_ptr < T > & desired,
std:: memory_order success, std:: memory_order failure ) noexcept ;
(5)
bool compare_exchange_strong ( std:: weak_ptr < T > & expected, std:: weak_ptr < T > && desired,
std:: memory_order success, std:: memory_order failure ) noexcept ;
(6)
bool compare_exchange_strong ( std:: weak_ptr < T > & expected, const std:: weak_ptr < T > & desired,
std:: memory_order order = std:: memory_order_seq_cst ) noexcept ;
(7)
bool compare_exchange_strong ( std:: weak_ptr < T > & expected, std:: weak_ptr < T > && desired,
std:: memory_order order = std:: memory_order_seq_cst ) noexcept ;
(8)

Compara atómicamente el subyacente weak_ptr en * this con expected , y si son equivalentes, reemplaza el primero con desired (realiza una operación de lectura-modificación-escritura). De lo contrario, carga el valor real almacenado en * this en expected (realiza una operación de carga). El reemplazo se realiza como si fuera mediante el operador de asignación de copia o movimiento de weak_ptr , según corresponda.

Dos weak_ptr son equivalentes si y solo si almacenan el mismo valor de puntero y comparten la propiedad.

Los modelos de memoria para las operaciones de lectura-modificación-escritura y carga son success y failure respectivamente. Para las sobrecargas (3,4,7,8) , order se utiliza tanto para las operaciones de lectura-modificación-escritura como para las de carga, excepto que std::memory_order_acquire y std::memory_order_relaxed se utilizan para la operación de carga si order == std:: memory_order_acq_rel , o order == std:: memory_order_release respectivamente.

Las versiones débiles (1-4) pueden fallar esporádicamente.

Contenidos

Parámetros

expected - referencia al valor que se espera encontrar en el objeto atómico
desired - el valor a almacenar en el objeto atómico si es igual al esperado
success - el orden de sincronización de memoria para la operación de lectura-modificación-escritura si la comparación tiene éxito. Se permiten todos los valores
failure - el orden de sincronización de memoria para la operación de carga si la comparación falla. No puede ser std::memory_order_release o std::memory_order_acq_rel y no puede especificar un ordenamiento más fuerte que success
order - el orden de sincronización de memoria para ambas operaciones

Valor de retorno

true si el valor atómico subyacente fue modificado, false en caso contrario.

Observaciones

Todos los cambios al objeto atomic_weak_ptr en sí, y todos los incrementos asociados de use_count , están garantizados para realizarse atómicamente. Los decrementos asociados de use_count ocurren después de la operación atómica, pero no se requiere que formen parte de ella. Cualquier operación asociada de destrucción o desasignación ocurre después de la operación atómica y no forma parte de ella.

Si la operación de comparación-intercambio devuelve true , expected no se accede después del paso de actualización atómica. Si devuelve false , expected se actualiza con el valor existente leído del objeto atomic_weak_ptr en el intento de actualización atómica. La actualización de use_count correspondiente a la escritura en expected es parte de la operación atómica, pero la escritura en expected misma no está requerida ser parte de la operación atómica.

Para las sobrecargas (1,3,5,7) , desired no se accede después del paso de actualización atómica.

Para las sobrecargas (2,4,6,8) , desired se mueve desde solo si la operación de comparación-intercambio devuelve true ; el movimiento ocurre después del paso de actualización atómica.

Notas

Las formas débiles (1-4) de las funciones pueden fallar espuriamente, es decir, actuar como si * this y expected no fueran equivalentes incluso cuando lo son. Cuando un compare-and-exchange está en un bucle, la versión débil proporcionará mejor rendimiento en algunas plataformas.

Véase también

especializa operaciones atómicas para std::shared_ptr
(plantilla de función)