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[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 задавался через указатели, что
было неоднозначно и могло допускать недопустимые значения указателей
задаётся через
атомарные объекты

См. также

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

Spec-Zone.ru

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