Namespaces
Variants

std:: atomic_ref

From cppreference.net
Concurrency support library
Threads
(C++11)
(C++20)
this_thread namespace
(C++11)
(C++11)
Cooperative cancellation
Mutual exclusion
Generic lock management
Condition variables
(C++11)
Semaphores
Latches and Barriers
(C++20)
(C++20)
Futures
(C++11)
(C++11)
(C++11)
Safe reclamation
Hazard pointers
Atomic types
(C++11)
atomic_ref
(C++20)
Initialization of atomic types
(C++11) (deprecated in C++20)
(C++11) (deprecated in C++20)
Memory ordering
(C++11) (deprecated in C++26)
Free functions for atomic operations
Free functions for atomic flags
Определено в заголовочном файле <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::atomic_ref является CopyConstructible .

Содержание

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

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

Члены данных

Участник Описание
T * ptr указатель на ссылаемый объект
( объект-член только для демонстрации* )
указывает, что тип всегда свободен от блокировок
(публичная статическая константа-член)
указывает требуемое выравнивание объекта для ссылки через atomic_ref
(публичная статическая константа-член)

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

создаёт объект atomic_ref
(публичная функция-член)
сохраняет значение в объект, на который ссылается atomic_ref объект
(публичная функция-член)
проверяет, является ли объект atomic_ref свободным от блокировок
(публичная функция-член)
атоматически заменяет значение ссылаемого объекта неатомарным аргументом
(публичная функция-член)
атомарно получает значение ссылаемого объекта
(публичная функция-член)
загружает значение из ссылаемого объекта
(публичная функция-член)
атомично заменяет значение ссылаемого объекта и получает ранее хранившееся значение
(публичная функция-член)
атомично сравнивает значение ссылаемого объекта с неатомарным аргументом и выполняет атомарный обмен при равенстве или атомарную загрузку при неравенстве
(публичная функция-член)
блокирует поток до получения уведомления и изменения атомарного значения
(публичная функция-член)
уведомляет по крайней мере один поток, ожидающий атомарный объект
(публичная функция-член)
уведомляет все потоки, заблокированные в ожидании атомарного объекта
(публичная функция-член)
(C++26)
возвращает адрес объекта
(публичная функция-член)
Предоставляется только тогда, когда T является арифметическим типом, отличным от cv bool или типа указателя на объект
атомически добавляет аргумент к значению, хранящемуся в ссылочном объекте, и получает значение, хранившееся ранее
(публичная функция-член)
атомически вычитает аргумент из значения, хранящегося в ссылочном объекте, и получает значение, хранившееся ранее
(публичная функция-член)
атомически добавляет к или вычитает из ссылочного значения
(публичная функция-член)
Предоставляется только тогда, когда T является целочисленным типом, отличным от cv bool или типа указателя на объект
(C++26)
атомарно выполняет std::max между аргументом и значением ссылаемого объекта и получает значение, хранившееся ранее
(публичная функция-член)
(C++26)
атомарно выполняет std::min между аргументом и значением ссылочного объекта и получает значение, хранившееся ранее
(публичная функция-член)
атомно увеличивает или уменьшает ссылаемый объект на единицу
(публичная функция-член)
Предоставляется только тогда, когда T является целочисленным типом, отличным от cv bool
атомически выполняет побитовое И между аргументом и значением ссылаемого объекта и получает значение, хранившееся ранее
(публичная функция-член)
атомно выполняет побитовое ИЛИ между аргументом и значением ссылаемого объекта и получает значение, которое хранилось ранее
(публичная функция-член)
атомарно выполняет побитовое исключающее ИЛИ между аргументом и значением ссылаемого объекта и получает значение, хранившееся ранее
(публичная функция-член)
атомически выполняет побитовое И, ИЛИ, исключающее ИЛИ с ссылочным значением
(публичная функция-член)

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

Стандарт указывает, что 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 /* см. ниже */

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 или любых операций, требующих арифметики указателей или реляционных сравнений (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) и указательных типов
(шаблон класса)