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
- возможно изменять значение по ссылке через
const
std::atomic_ref
объект.
Если выполняется любое из следующих условий, программа является некорректной:
- 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
/* см. ниже */
|
(3) | (начиная с C++20) |
Примечания
Реализации могут объединять указанные специализации. Например, MSVC STL объединяет все их в основной шаблон.
Когда
T
является
cv
void
или типом функции,
std
::
atomic_ref
<
T
*
>
(т.е.
std
::
atomic_ref
<
void
*
>
,
std
::
atomic_ref
<
int
(
*
)
(
)
>
и т.д.) не имеет
difference_type
или любых операций, требующих арифметики указателей
или реляционных сравнений
(since 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++.
| DR | Применяется к | Поведение как опубликовано | Корректное поведение |
|---|---|---|---|
|
LWG 3508
( P3323R1 ) |
C++20 |
atomic_ref
<
T
>
имел нереализуемые операции
если
T
является
const
типом или типом указателя на не-объект
|
эти операции либо ограничены
либо не предоставляются для неподходящих
T
|
Смотрите также
|
(C++11)
|
шаблон класса atomic и специализации для bool, целочисленных,
чисел с плавающей запятой,
(since C++20)
и указательных типов
(шаблон класса) |