Spec-Zone.ru › C++

std::atomic_ref

Определён в заголовке <atomic>
template< class T >
struct atomic_ref;
(начиная с 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 является поверхностной — изменить значение, на которое она ссылается, можно через объект std::atomic_ref с квалификатором const.

Если выполняется любое из следующих условий, программа некорректна:

  • std::is_trivially_copyable_v<T> — это false.
  • is_always_lock_free — это false, а std::is_volatile_v<T> — это true.

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

Вложенные типы

Тип Определение
value_type std::remove_cv_t<T>
difference_type
  • value_type, если T является арифметическим типом, отличным от cv bool.
  • В противном случае std::ptrdiff_t, если T является типом указателя на объект.
  • В противном случае не определён.

Данные-члены

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

Функции-члены

(конструктор)
создаёт объект atomic_ref
(открытая функция-член)
operator=
сохраняет значение в объекте, на который ссылается объект atomic_ref
(открытая функция-член)
is_lock_free
проверяет, является ли объект atomic_ref свободным от блокировок
(открытая функция-член)
store
атомарно заменяет значение объекта, на который осуществляется ссылка, неатомарным аргументом
(открытая функция-член)
load
атомарно получает значение объекта, на который осуществляется ссылка
(открытая функция-член)
operator value_type
загружает значение из объекта, на который осуществляется ссылка
(открытая функция-член)
exchange
атомарно заменяет значение объекта, на который осуществляется ссылка, и получает значение, хранившееся ранее
(открытая функция-член)
compare_exchange_weakcompare_exchange_strong
атомарно сравнивает значение объекта, на который осуществляется ссылка, с неатомарным аргументом и выполняет атомарный обмен, если значения равны, или атомарную загрузку, если они не равны
(открытая функция-член)
wait
блокирует поток до получения уведомления и изменения атомарного значения
(открытая функция-член)
notify_one
уведомляет как минимум один поток, ожидающий атомарный объект
(открытая функция-член)
notify_all
уведомляет все потоки, заблокированные в ожидании атомарного объекта
(открытая функция-член)
address
(C++26)
возвращает адрес объекта
(открытая функция-член)
Предоставляется только тогда, когда T является арифметическим типом, отличным от cv bool, или типом указателя на объект
fetch_add
атомарно прибавляет аргумент к значению, хранящемуся в объекте, на который осуществляется ссылка, и получает значение, хранившееся ранее
(открытая функция-член)
fetch_sub
атомарно вычитает аргумент из значения, хранящегося в объекте, на который осуществляется ссылка, и получает значение, хранившееся ранее
(открытая функция-член)
operator+=operator-=
атомарно прибавляет к значению, на которое осуществляется ссылка, или вычитает из него
(открытая функция-член)
Предоставляется только тогда, когда T является целочисленным типом, отличным от cv bool, или типом указателя на объект
fetch_max
(C++26)
атомарно вычисляет std::max аргумента и значения объекта, на который осуществляется ссылка, и получает значение, хранившееся ранее
(открытая функция-член)
fetch_min
(C++26)
атомарно вычисляет std::min аргумента и значения объекта, на который осуществляется ссылка, и получает значение, хранившееся ранее
(открытая функция-член)
operator++operator++(int)operator--operator--(int)
атомарно увеличивает или уменьшает значение объекта, на который осуществляется ссылка, на единицу
(открытая функция-член)
Предоставляется только тогда, когда T является целочисленным типом, отличным от cv bool
fetch_and
атомарно выполняет побитовое И между аргументом и значением объекта, на который осуществляется ссылка, и получает значение, хранившееся ранее
(открытая функция-член)
fetch_or
атомарно выполняет побитовое ИЛИ между аргументом и значением объекта, на который осуществляется ссылка, и получает значение, хранившееся ранее
(открытая функция-член)
fetch_xor
атомарно выполняет побитовое исключающее ИЛИ между аргументом и значением объекта, на который осуществляется ссылка, и получает значение, хранившееся ранее
(открытая функция-член)
operator&=operator|=operator^=
атомарно выполняет побитовые И, ИЛИ или исключающее ИЛИ со значением, на которое осуществляется ссылка
(открытая функция-член)

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

Стандарт определяет следующие специализации std::atomic_ref:

template<>
struct atomic_ref</*integral-type*/>;
(1) (начиная с C++20)
template<>
struct atomic_ref</*floating-point-type*/>;
(2) (начиная с C++20)
template< class /*pointer-type*/ >
    requires /* see below */
struct atomic_ref</*pointer-type*/>;
(3) (начиная с C++20)
1) /*integral-type*/ обозначает целочисленный тип, возможно с квалификаторами cv, отличный от cv bool.
2) /*floating-point-type*/ обозначает тип с плавающей точкой, возможно с квалификаторами cv.
3) Частичная специализация предоставляется для типов /*pointer-type*/, которые являются, возможно с квалификаторами cv, типами указателей на объекты.

Примечания

Реализации могут объединять указанные специализации. Например, MSVC STL объединяет их все в основной шаблон.

Если T является cv void или типом функции, std::atomic_ref<T*> (т. е. std::atomic_ref<void*>, std::atomic_ref<int(*)()> и т. д.) не имеет difference_type и любых операций, требующих арифметики указателей или реляционного сравнения(начиная с C++26).

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

Отчёты об ошибках

Следующие отчёты об ошибках, изменяющие поведение, были ретроактивно применены к ранее опубликованным стандартам C++.

Отчёт об ошибке Применяется к Опубликованное поведение Корректное поведение
LWG 3508
(P3323R1)
C++20 atomic_ref<T> имел нереализуемые операции
если T является типом const или типом указателя не на объект
эти операции либо ограничены,
либо не предоставляются для неподходящих T

См. также

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

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

Spec-Zone.ru

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