Namespaces
Variants

std:: atomic_is_lock_free, ATOMIC_xxx_LOCK_FREE

From cppreference.net
Concurrency support library
Threads
(C++11)
(C++20)
this_thread namespace
(C++11)
(C++11)
Cooperative cancellation
Mutual exclusion
Generic lock management
Condition variables
(C++11)
Semaphores
Latches and Barriers
(C++20)
(C++20)
Futures
(C++11)
(C++11)
(C++11)
Safe reclamation
Hazard pointers
Atomic types
(C++11)
(C++20)
Initialization of atomic types
(C++11) (deprecated in C++20)
(C++11) (deprecated in C++20)
Memory ordering
(C++11) (deprecated in C++26)
Free functions for atomic operations
atomic_is_lock_free
(C++11)
Free functions for atomic flags
Определено в заголовочном файле <atomic>
template < class T >
bool atomic_is_lock_free ( const volatile std:: atomic < T > * obj ) noexcept ;
(1) (начиная с C++11)
template < class T >
bool atomic_is_lock_free ( const std:: atomic < T > * obj ) noexcept ;
(2) (начиная с C++11)
#define ATOMIC_BOOL_LOCK_FREE     /* unspecified */

#define ATOMIC_CHAR_LOCK_FREE     /* unspecified */
#define ATOMIC_CHAR16_T_LOCK_FREE /* unspecified */
#define ATOMIC_CHAR32_T_LOCK_FREE /* unspecified */
#define ATOMIC_WCHAR_T_LOCK_FREE  /* unspecified */
#define ATOMIC_SHORT_LOCK_FREE    /* unspecified */
#define ATOMIC_INT_LOCK_FREE      /* unspecified */
#define ATOMIC_LONG_LOCK_FREE     /* unspecified */
#define ATOMIC_LLONG_LOCK_FREE    /* unspecified */

#define ATOMIC_POINTER_LOCK_FREE  /* unspecified */
(3) (начиная с C++11)
#define ATOMIC_CHAR8_T_LOCK_FREE  /* unspecified */
(4) (начиная с C++20)
1,2) Определяет, реализован ли атомарный объект, на который указывает obj без блокировок, как если бы вызывался obj - > is_lock_free ( ) . В любом данном выполнении программы результат запроса о lock-free одинаков для всех атомарных объектов одного типа.
3,4) Раскрывается в целочисленное константное выражение со значением
  • 0 для встроенных атомарных типов, которые никогда не являются lock-free,
  • 1 для встроенных атомарных типов, которые иногда являются lock-free,
  • 2 для встроенных атомарных типов, которые всегда являются lock-free.

Содержание

Параметры

obj - указатель на атомарный объект для исследования

Возвращаемое значение

true если * obj является lock-free атомарным объектом, false в противном случае.

Примечания

Все атомарные типы, за исключением std::atomic_flag могут быть реализованы с использованием мьютексов или других блокирующих операций вместо lock-free атомарных инструкций процессора. Атомарным типам также разрешено быть иногда lock-free: например, если только некоторые субархитектуры поддерживают lock-free атомарный доступ для данного типа (такие как инструкция CMPXCHG16B на x86-64), то информация о том, являются ли атомарные операции lock-free, может стать известной только во время выполнения.

Стандарт C++ рекомендует (но не требует), чтобы lock-free атомарные операции также были address-free, то есть пригодными для взаимодействия между процессами, использующими разделяемую память.

Пример

#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';
}

Возможный вывод:

std::atomic<A> is lock free? false
std::atomic<B> is lock free? true

Отчеты о дефектах

Следующие отчеты об изменениях в поведении, содержащие описания дефектов, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Applied to Behavior as published Correct behavior
LWG 3249 C++11 atomic_is_lock_free был описан через указатели, что
было неоднозначно и могло принимать недопустимые значения указателей
описан через
атомарные объекты

Смотрите также

проверяет, является ли атомарный объект свободным от блокировок
(публичная функция-член std::atomic<T> )
атомарный булев тип, свободный от блокировок
(класс)
[static] (C++17)
указывает, что тип всегда свободен от блокировок
(публичная статическая константа-член std::atomic<T> )
(устарело в C++20) (удалено в C++26)
специализирует атомарные операции для std::shared_ptr
(шаблон функции)
Документация C для atomic_is_lock_free
Документация C для ATOMIC_*_LOCK_FREE