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 */ #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) |
obj, без блокировок, как если бы вызывалась obj->is_lock_free(). В любой заданной программе выполнения результат запроса без блокировок одинаков для всех атомарных объектов одного и того же типа.-
0для встроенных атомарных типов, которые никогда не являются безблокировочными, -
1для встроенных атомарных типов, которые иногда являются безблокировочными, -
2для встроенных атомарных типов, которые всегда являются безблокировочными.
Параметры
| obj | - | указатель на атомарный объект для проверки |
Значение результата
true если *obj — это атомарное значение без блокировок, false в противном случае.
Примечания
Все атомарные типы, за исключением std::atomic_flag, могут быть реализованы с использованием мьютексов или других операций блокировки вместо использования безблокировочных атомарных инструкций процессора. Атомарные типы также могут быть иногда безблокировочными: например, если только некоторые подархитектуры поддерживают безблокировочный атомарный доступ для данного типа (например, инструкция CMPXCHG16B на x86-64), неизвестно, являются ли атомные значения безблокировочными до выполнения.
Стандарт C++ рекомендует (но не требует), чтобы безблокировочные атомарные операции также были адресными, то есть подходили для взаимодействия между процессами с помощью общей памяти.
Пример
#include <atomic>
#include <iostream>
#include <utility>
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> 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 | Применен к | Поведение, как опубликовано | Правильное поведение |
|---|---|---|---|
| LWG 3249 | C++11 |
atomic_is_lock_free было указано через указатели, что было неоднозначно и могло принять некорректные значения указателей | указано через атомарные объекты |
См. также
| проверяет, является ли атомарный объект безблокировочным (публичный член-функция std::atomic<T>) |
|
специализирует атомарные операции для std::shared_ptr (шаблон функции) |
|
|
(C++11) | безблокировочный булевый атомарный тип (класс) |
|
[статический] (C++17) | указывает, что тип всегда безблокировочный (публичный статический член-константа std::atomic<T>) |
Документация на C для atomic_is_lock_free |
|
Документация на C для ATOMIC_*_LOCK_FREE |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/atomic/atomic_is_lock_free