std::atomic_is_lock_free, ATOMIC_xxx_LOCK_FREE
| Definido en el archivo de encabezado <atomic>
|
||
| (1) | (desde C++11) | |
template< class T > bool atomic_is_lock_free( const volatile std::atomic<T>* obj ) noexcept; |
||
template< class T > bool atomic_is_lock_free( const std::atomic<T>* obj ) noexcept; |
||
#define ATOMIC_BOOL_LOCK_FREE /* sin especificar */ #define ATOMIC_CHAR_LOCK_FREE /* sin especificar */ #define ATOMIC_CHAR16_T_LOCK_FREE /* sin especificar */ #define ATOMIC_CHAR32_T_LOCK_FREE /* sin especificar */ #define ATOMIC_WCHAR_T_LOCK_FREE /* sin especificar */ #define ATOMIC_SHORT_LOCK_FREE /* sin especificar */ #define ATOMIC_INT_LOCK_FREE /* sin especificar */ #define ATOMIC_LONG_LOCK_FREE /* sin especificar */ #define ATOMIC_LLONG_LOCK_FREE /* sin especificar */ #define ATOMIC_POINTER_LOCK_FREE /* sin especificar */ |
(2) | (desde C++11) |
#define ATOMIC_CHAR8_T_LOCK_FREE /* sin especificar */ |
(3) | (desde C++20) |
obj se implementa libre de bloqueo, como si lo fuera llamando a obj->is_lock_free(). En la ejecución de cualquier programa, el resultado de la consulta sin bloqueo es la misma para todos los objetos atómicos del mismo tipo.. 0para los tipos atómicos integrados que nunca son libres de bloqueo;1para los tipos atómicos integrados que a veces son libres de bloqueo;2para los tipos atómicos integrados que siempre son libres de bloqueo.
Parámetros
| obj | - | Puntero al objeto atómico a examinar. |
Valor de retorno
true si *obj es atómico libre de bloqueo, false de lo contrario.
Notas
Todos los tipos atómicos excepto std::atomic_flag implementarse usando mutex u otras operaciones de bloqueo, en lugar de usar las instrucciones atómicas sin bloqueo de CPU. Los tipos atómicos también pueden ser a veces libres de bloqueo: por ejemplo, si solo algunas subarquitecturas admiten el acceso atómico sin bloqueo para un tipo determinado (como la instrucción CMPXCHG16B en x86-64), puede no conocerse hasta el tiempo de ejecución si los tipos atómicos son libres de bloqueo.
El estándar de C++ recomienda (pero no requiere) que las operaciones atómicas sin bloqueo también sean libres de direcciones, es decir, adecuadas para la comunicación entre procesos que utilizan memoria compartida.
Ejemplo
#include <iostream>
#include <utility>
#include <atomic>
struct A { int a[100]; };
struct B { int x, y; };
int main()
{
std::atomic<A> a;
std::atomic<B> b;
std::cout << std::boolalpha
<< "std::atomic<A> es libre de bloqueo? "
<< std::atomic_is_lock_free(&a) << '\n'
<< "std::atomic<B> es libre de bloqueo? "
<< std::atomic_is_lock_free(&b) << '\n';
}
Posible salida:
std::atomic<A> es libre de bloqueo? false
std::atomic<B> es libre de bloqueo? true
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 3249 | C++11 | atomic_is_lock_free se especificaba mediante punteros, lo que eraambiguo y podría aceptar valores de puntero inválidos. |
Especificado mediante objetos atómicos. |
Véase también
| Comprueba si el objeto atómico es sin bloqueo. (función miembro pública de std::atomic)
| |
| Especializa las operaciones atómicas para std::shared_ptr. (plantilla de función) | |
(C++11) |
El tipo atómico booleano libre de bloqueo. (clase) |
[estático] (C++17) |
Indica que el tipo es siempre libre de bloqueo. (constante miembro pública estática de std::atomic)
|
Documentación de C para atomic_is_lock_free
| |
Documentación de C para ATOMIC_*_LOCK_FREE
| |