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 |
|
Данные-члены
| Член | Описание |
|---|---|
T* ptr | указатель на объект, на который осуществляется ссылка (член-объект, предназначенный только для описания) |
|
[static] | указывает, что тип всегда является свободным от блокировок (открытая статическая константа-член) |
|
[static] | указывает требуемое выравнивание объекта, на который ссылается atomic_ref (открытая статическая константа-член) |
Функции-члены
создаёт объект atomic_ref (открытая функция-член) |
|
сохраняет значение в объекте, на который ссылается объект atomic_ref (открытая функция-член) |
|
проверяет, является ли объект atomic_ref свободным от блокировок (открытая функция-член) |
|
| атомарно заменяет значение объекта, на который осуществляется ссылка, неатомарным аргументом (открытая функция-член) |
|
| атомарно получает значение объекта, на который осуществляется ссылка (открытая функция-член) |
|
| загружает значение из объекта, на который осуществляется ссылка (открытая функция-член) |
|
| атомарно заменяет значение объекта, на который осуществляется ссылка, и получает значение, хранившееся ранее (открытая функция-член) |
|
| атомарно сравнивает значение объекта, на который осуществляется ссылка, с неатомарным аргументом и выполняет атомарный обмен, если значения равны, или атомарную загрузку, если они не равны (открытая функция-член) |
|
| блокирует поток до получения уведомления и изменения атомарного значения (открытая функция-член) |
|
| уведомляет как минимум один поток, ожидающий атомарный объект (открытая функция-член) |
|
| уведомляет все потоки, заблокированные в ожидании атомарного объекта (открытая функция-член) |
|
|
(C++26) | возвращает адрес объекта (открытая функция-член) |
Предоставляется только тогда, когда |
|
| атомарно прибавляет аргумент к значению, хранящемуся в объекте, на который осуществляется ссылка, и получает значение, хранившееся ранее (открытая функция-член) |
|
| атомарно вычитает аргумент из значения, хранящегося в объекте, на который осуществляется ссылка, и получает значение, хранившееся ранее (открытая функция-член) |
|
| атомарно прибавляет к значению, на которое осуществляется ссылка, или вычитает из него (открытая функция-член) |
|
Предоставляется только тогда, когда |
|
|
(C++26) | атомарно вычисляет std::max аргумента и значения объекта, на который осуществляется ссылка, и получает значение, хранившееся ранее (открытая функция-член) |
|
(C++26) | атомарно вычисляет std::min аргумента и значения объекта, на который осуществляется ссылка, и получает значение, хранившееся ранее (открытая функция-член) |
| атомарно увеличивает или уменьшает значение объекта, на который осуществляется ссылка, на единицу (открытая функция-член) |
|
Предоставляется только тогда, когда |
|
| атомарно выполняет побитовое И между аргументом и значением объекта, на который осуществляется ссылка, и получает значение, хранившееся ранее (открытая функция-член) |
|
| атомарно выполняет побитовое ИЛИ между аргументом и значением объекта, на который осуществляется ссылка, и получает значение, хранившееся ранее (открытая функция-член) |
|
| атомарно выполняет побитовое исключающее ИЛИ между аргументом и значением объекта, на который осуществляется ссылка, и получает значение, хранившееся ранее (открытая функция-член) |
|
| атомарно выполняет побитовые И, ИЛИ или исключающее ИЛИ со значением, на которое осуществляется ссылка (открытая функция-член) |
|
Специализации
Стандарт определяет следующие специализации 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) |
Примечания
Реализации могут объединять указанные специализации. Например, 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 |
См. также
|
(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