std:: atomic_is_lock_free, ATOMIC_xxx_LOCK_FREE
|
Определено в заголовочном файле
<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 */
|
(3) | (начиная с C++11) |
|
#define ATOMIC_CHAR8_T_LOCK_FREE /* unspecified */
|
(4) | (начиная с C++20) |
- 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>
)
|
|
|
(C++11)
|
атомарный булев тип, свободный от блокировок
(класс) |
|
[static]
(C++17)
|
указывает, что тип всегда свободен от блокировок
(публичная статическая константа-член
std::atomic<T>
)
|
|
(устарело в C++20)
(удалено в C++26)
|
специализирует атомарные операции для
std::shared_ptr
(шаблон функции) |
|
Документация C
для
atomic_is_lock_free
|
|
|
Документация C
для
ATOMIC_*_LOCK_FREE
|
|