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[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 | Применяется к | Опубликованное поведение | Правильное поведение |
|---|---|---|---|
| LWG 3249 | C++11 |
atomic_is_lock_free задавался через указатели, чтобыло неоднозначно и могло допускать недопустимые значения указателей | задаётся через атомарные объекты |
См. также
| проверяет, реализован ли атомарный объект без блокировок (открытая функция-член std::atomic<T>) |
|
|
(C++11) | атомарный логический тип без блокировок (класс) |
|
[статический] (C++17) | указывает, что тип всегда реализуется без блокировок (открытая статическая константа-член std::atomic<T>) |
|
(устарело в C++20)(удалено в C++26) | специализирует атомарные операции для std::shared_ptr (шаблон функции) |
Документация по 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/cpp/atomic/atomic_is_lock_free