std:: atomic_is_lock_free, ATOMIC_xxx_LOCK_FREE
|
Definido en el encabezado
<atomic>
|
||
|
template
<
class
T
>
bool atomic_is_lock_free ( const volatile std:: atomic < T > * obj ) noexcept ; |
(1) | (desde C++11) |
|
template
<
class
T
>
bool atomic_is_lock_free ( const std:: atomic < T > * obj ) noexcept ; |
(2) | (desde C++11) |
|
#define ATOMIC_BOOL_LOCK_FREE /* unspecified */
#define ATOMIC_CHAR_LOCK_FREE /* unspecified */
|
(3) | (desde C++11) |
|
#define ATOMIC_CHAR8_T_LOCK_FREE /* unspecified */
|
(4) | (desde C++20) |
- 0 para los tipos atómicos incorporados que nunca son libres de bloqueo,
- 1 para los tipos atómicos incorporados que son a veces libres de bloqueo,
- 2 para los tipos atómicos incorporados que son siempre libres de bloqueo.
Contenidos |
Parámetros
| obj | - | puntero al objeto atómico a examinar |
Valor de retorno
true si * obj es un atómico libre de bloqueo, false en caso contrario.
Notas
Todos los tipos atómicos excepto std::atomic_flag pueden implementarse usando mutexes u otras operaciones de bloqueo, en lugar de usar las instrucciones atómicas sin bloqueo de la CPU. También se permite que los tipos atómicos sean a veces sin bloqueo: por ejemplo, si solo algunas subarquitecturas soportan acceso atómico sin bloqueo para un tipo dado (como la instrucción CMPXCHG16B en x86-64), si los atómicos son sin bloqueo puede no saberse hasta el tiempo de ejecución.
El estándar de C++ recomienda (pero no requiere) que las operaciones atómicas lock-free también sean address-free, es decir, adecuadas para la comunicación entre procesos que utilizan memoria compartida.
Ejemplo
#include <atomic> #include <iostream> #include <utility> struct A { int a[4]; }; struct B { int x, y; }; int main() { std::atomic<A> a; std::atomic<B> b; std::cout << std::boolalpha << "std::atomic<A> is lock free? " << std::atomic_is_lock_free(&a) << '\n' << "std::atomic<B> is lock free? " << std::atomic_is_lock_free(&b) << '\n'; }
Salida posible:
std::atomic<A> is lock free? false std::atomic<B> is lock free? true
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares publicados anteriormente de C++.
| DR | Aplicado a | Comportamiento publicado | Comportamiento correcto |
|---|---|---|---|
| LWG 3249 | C++11 |
atomic_is_lock_free
se especificaba mediante punteros, lo cual
era ambiguo y podría aceptar valores de puntero inválidos |
especificado mediante
objetos atómicos |
Véase también
|
verifica si el objeto atómico es libre de bloqueo
(función miembro pública de
std::atomic<T>
)
|
|
|
(C++11)
|
el tipo atómico booleano libre de bloqueo
(clase) |
|
[static]
(C++17)
|
indica que el tipo es siempre libre de bloqueo
(constante miembro estática pública de
std::atomic<T>
)
|
|
(obsoleto en C++20)
(eliminado en C++26)
|
especializa operaciones atómicas para
std::shared_ptr
(plantilla de función) |
|
Documentación C
para
atomic_is_lock_free
|
|
|
Documentación C
para
ATOMIC_*_LOCK_FREE
|
|