Пространства имён
Варианты
Действия

std::atomic_ref

Материал из cppreference.com
< cpp‎ | atomic
 
 
 
 
Определено в заголовочном файле <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.

Как и для языковых ссылок, константность для std::atomic_ref невелика - можно изменить указуемое значение с помощью объекта conststd::atomic_ref.

Содержание

[править]Специализации

[править]Основной шаблон

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

struct Counters {int a;int b;};// определяемый пользователем тип, допускающий// тривиальное копирование alignas(std::atomic_ref<Counters>::required_alignment) Counters counter; std::atomic_ref<Counters> cnt(counter);// специализация для определяемого// пользователем типа

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

Стандартная библиотека предоставляет частичную специализацию шаблона 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;
  • Стандартные целочисленные типы со знаком: signedchar, short, int, long и longlong;
  • Стандартные целочисленные типы без знака: unsignedchar, unsignedshort, unsignedint, unsignedlong и unsignedlonglong;
  • Любые дополнительные целочисленные типы, необходимые для typedef‘ов в заголовке <cstdint>.

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

[править]Специализации для типов с плавающей запятой

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

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

[править]Типы-элементы

Тип элемент Определение
value_typeсмотрите ниже
difference_typevalue_type(только для специализаций atomic_ref<Целочисленный тип> и atomic_ref<Тип с плавающей запятой>)
std::ptrdiff_t(только для специализаций std::atomic_ref<T*>)

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

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

[править]Функции-элементы

создаёт объект atomic_ref
(public функция-элемент)[править]
сохраняет значение в объекте, на который ссылается объект atomic_ref
(public функция-элемент)[править]
проверяет, свободен ли от блокировок объект atomic_ref
(public функция-элемент)[править]
атомарно заменяет значение указанного объекта неатомарным аргументом
(public функция-элемент)[править]
атомарно получает значение указанного объекта
(public функция-элемент)[править]
загружает значение из указанного объекта
(public функция-элемент)[править]
атомарно заменяет значение указанного объекта и получает значение, которое было ранее
(public функция-элемент)[править]
атомарно сравнивает значение указанного объекта с неатомарным аргументом и выполняет атомарный обмен, если они равны, или атомарную загрузку, если нет
(public функция-элемент)[править]
блокирует поток до тех пор, пока не получит уведомление и не изменится атомарное значение
(public функция-элемент)[править]
уведомляет хотя бы один поток, ожидающий атомарный объект
(public функция-элемент)[править]
уведомляет все потоки, заблокированные в ожидании атомарного объекта
(public функция-элемент)[править]

Константы

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

[править]Специализированные функции-элементы

атомарно добавляет аргумент к значению, хранящемуся в указанном объекте, и получает значение, сохранённое ранее
(public функция-элемент)[править]
атомарно вычитает аргумент из значения, хранящегося в указанном объекте, и получает значение, сохранённое ранее
(public функция-элемент)[править]
атомарно выполняет побитовое И между аргументом и значением указанного объекта и получает значение, сохранённое ранее
(public функция-элемент)[править]
атомарно выполняет побитовое ИЛИ между аргументом и значением указанного объекта и получает значение, сохранённое ранее
(public функция-элемент)[править]
атомарно выполняет побитовое исключающее ИЛИ между аргументом и значением указанного объекта и получает значение, сохранённое ранее
(public функция-элемент)[править]
атомарно увеличивает или уменьшает указанный объект на единицу
(public функция-элемент)[править]
атомарно складывает, вычитает или выполняет побитовое И, ИЛИ, исключающее ИЛИ с указанным значением
(public функция-элемент)[править]

[править]Примечание

Макрос Тестирования функциональностиЗначениеСтандартФункциональность
__cpp_lib_atomic_ref201806L(C++20)std::atomic_ref

[править]Смотрите также

(C++11)
шаблон класса atomic и его специализации для bool, целочисленных типов и указателей
(шаблон класса)[править]
close