Spec-Zone.ru › C++

std::atomic_ref

Определено в заголовке <atomic>
template< class T >
struct atomic_ref;
(1) (с C++20)
template< class T >
struct atomic_ref<T*>;
(2) (с C++20)

Шаблон класса std::atomic_ref применяет атомарные операции к объекту, на который он ссылается. На протяжении всего жизненного цикла объекта std::atomic_ref, объект, на который он ссылается, считается атомарным объектом. Если одна нить выполняет запись в атомарный объект, а другая нить — чтение из него, поведение определено (см. модель памяти для подробностей о гонках данных). Кроме того, обращение к атомарным объектам может устанавливать межнитевую синхронизацию и упорядочивать неатомарные обращения к памяти, как указано в std::memory_order.

Жизненный цикл объекта должен превышать жизненный цикл всех std::atomic_ref , которые ссылаются на объект. Пока любой экземпляр std::atomic_ref , ссылающийся на объект, существует, к объекту должен быть исключительный доступ только через эти экземпляры std::atomic_ref. Ни один подобъект объекта, на который ссылается объект std::atomic_ref, не может быть одновременно ссылаемым другим объектом std::atomic_ref.

Атомарные операции, применяемые к объекту через std::atomic_ref, являются атомарными по отношению к атомарным операциям, применяемым через любой другой std::atomic_ref, ссылающийся на тот же объект.

std::atomic_ref является CopyConstructible.

Как и языковые ссылки, constness является поверхностным для std::atomic_ref — возможно изменить значение, на которое ссылается, через объект const std::atomic_ref.

Специализации

Основной шаблон

Основной шаблон std::atomic_ref может быть инстанцирован с любым TriviallyCopyable типом T (включая bool):

struct Counters { int a; int b; }; // user-defined trivially-copyable type
alignas(std::atomic_ref<Counters>::required_alignment) Counters counter;
std::atomic_ref<Counters> cnt(counter); // specialization for the user-defined type

Частичная специализация для типов указателей

Библиотека стандартных шаблонов предоставляет частичные специализации шаблона std::atomic_ref для всех типов указателей. В дополнение к операциям, предоставляемым для всех атомарных типов, эти специализации дополнительно поддерживают атомарные арифметические операции, подходящие для типов указателей, такие как fetch_add, fetch_sub.

Специализации для целочисленных типов

При инстанцировании с одним из следующих целочисленных типов, std::atomic_ref предоставляет дополнительные атомарные операции, подходящие для целочисленных типов, такие как fetch_add, fetch_sub, fetch_and, fetch_or, fetch_xor:

  • Типы символов char, char8_t, char16_t, char32_t и wchar_t;
  • Стандартные целочисленные типы со знаком: signed char, short, int, long и long long;
  • Стандартные целочисленные типы без знака: unsigned char, unsigned short, unsigned int, unsigned long и unsigned long long;
  • Любые дополнительные целочисленные типы, необходимые псевдонимами в заголовке <cstdint>.

Целочисленная арифметика определяется как двухдополнительная; неопределённых результатов нет.

Специализации для типов с плавающей точкой

При инстанцировании с одним из неквалифицированных типов с плавающей точкой (float, double, long double и неквалифицированные типы с расширенной плавающей точкой extended floating-point types(с C++23)), std::atomic_ref предоставляет дополнительные атомарные операции, подходящие для типов с плавающей точкой, такие как fetch_add и fetch_sub.

Ни одна операция не приводит к неопределённому поведению, даже если результат не представим в типе с плавающей точкой. Среда с плавающей точкой, которая действует, может отличаться от среды с плавающей точкой вызывающей нити.

Типы членов

Тип члена Определение
value_type см. ниже
difference_type value_type (только для специализаций atomic_ref<Integral> и atomic_ref<Floating>)
std::ptrdiff_t (только для специализаций std::atomic_ref<T*>)

Для каждого std::atomic_ref<X> (специализирован или нет), std::atomic_ref<X>::value_type является X.

difference_type не определён в основном шаблоне atomic_ref.

Функции членов

(конструктор)
создаёт объект atomic_ref
(публичная функция-член)
operator=
сохраняет значение в объект, на который ссылается объект atomic_ref
(публичная функция-член)
is_lock_free
проверяет, является ли объект atomic_ref без блокировки
(публичная функция-член)
store
атомарно заменяет значение объекта-ссылка на неатомарный аргумент
(публичная функция-член)
load
атомарно получает значение объекта-ссылка
(публичная функция-член)
operator T
загружает значение из объекта-ссылка
(публичная функция-член)
exchange
атомарно заменяет значение объекта-ссылка и получает ранее хранимое значение
(публичная функция-член)
compare_exchange_weakcompare_exchange_strong
атомарно сравнивает значение объекта-ссылка с неатомарным аргументом и выполняет атомарную замену, если они равны, или атомарное чтение, если нет
(публичная функция-член)
wait
(C++20)
блокирует нить до уведомления и изменения атомарного значения
(публичная функция-член)
notify_one
(C++20)
уведомляет хотя бы одну нить, ожидающую атомарный объект
(публичная функция-член)
notify_all
(C++20)
уведомляет все нити, заблокированные в ожидании атомарного объекта
(публичная функция-член)

Константы

is_always_lock_free
[static]
указывает, что тип всегда без блокировки
(публичная статическая константа)
required_alignment
[static]
указывает требуемое выравнивание объекта, который должен быть сопоставлен с объектом atomic_ref
(публичная статическая константа)

Специализированные функции-члены

fetch_add
атомарно добавляет аргумент к значению, хранящемуся в объекте-ссылке, и возвращает ранее хранившееся значение
(публичный член-функция)
fetch_sub
атомарно вычитает аргумент из значения, хранящегося в объекте-ссылке, и возвращает ранее хранившееся значение
(публичный член-функция)
fetch_and
атомарно выполняет побитовое И между аргументом и значением объекта-ссылки и возвращает ранее хранившееся значение
(публичный член-функция)
fetch_or
атомарно выполняет побитовое ИЛИ между аргументом и значением объекта-ссылки и возвращает ранее хранившееся значение
(публичный член-функция)
fetch_xor
атомарно выполняет побитовое ИСКЛЮЧАЮЩЕЕ ИЛИ между аргументом и значением объекта-ссылки и возвращает ранее хранившееся значение
(публичный член-функция)
operator++operator++(int)operator--operator--(int)
атомарно увеличивает или уменьшает объект-ссылку на единицу
(публичный член-функция)
operator+=operator-=operator&=operator|=operator^=
атомарно добавляет, вычитает или выполняет побитовые операции И, ИЛИ, ИСКЛЮЧАЮЩЕЕ ИЛИ со значением объекта-ссылки
(публичный член-функция)

Примечания

Макрокоманда проверки наличия функции Значение Стандарт Функция
__cpp_lib_atomic_ref 201806L (C++20) std::atomic_ref

См. также

atomic
(C++11)
шаблон класса atomic и специализации для bool, целочисленных, с плавающей точкой,(с C++20) и указательных типов
(шаблон класса)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/atomic/atomic_ref

Spec-Zone.ru

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