Spec-Zone.ru › C++

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)
1,2) Определяет, реализовано ли атомарное значение, на которое указывает obj, без блокировок, как если бы вызывалась obj->is_lock_free(). В любой заданной программе выполнения результат запроса без блокировок одинаков для всех атомарных объектов одного и того же типа.
3,4) Расширяется до целочисленной константы с значением
  • ​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 было указано через указатели, что было неоднозначно и могло принять некорректные значения указателей указано через
атомарные объекты

См. также

is_lock_free
проверяет, является ли атомарный объект безблокировочным
(публичный член-функция std::atomic<T>)
std::atomic_is_lock_free(std::shared_ptr)
специализирует атомарные операции для std::shared_ptr
(шаблон функции)
atomic_flag
(C++11)
безблокировочный булевый атомарный тип
(класс)
is_always_lock_free
[статический] (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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API