std::atomic_ref
Определено в заголовке <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.
Как и языковые ссылки, constness является поверхностным для std::atomic_ref — возможно изменить значение, на которое ссылается, через объект const std::atomic_ref.
Специализации
Основной шаблон
Основной шаблон std::atomic_ref может быть инстанцирован с любым TriviallyCopyable типом T (включая bool):
struct Counters { int a; int b; }; // user-defined trivially-copyable type
alignas(std::atomic_ref<Counters>::required_alignment) Counters counter;
std::atomic_ref<Counters> cnt(counter); // specialization for the user-defined typeЧастичная специализация для типов указателей
Библиотека стандартных шаблонов предоставляет частичные специализации шаблона 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;
- Стандартные целочисленные типы со знаком: signed char, short, int, long и long long;
- Стандартные целочисленные типы без знака: unsigned char, unsigned short, unsigned int, unsigned long и unsigned long long;
- Любые дополнительные целочисленные типы, необходимые псевдонимами в заголовке
<cstdint>.
Целочисленная арифметика определяется как двухдополнительная; неопределённых результатов нет.
Специализации для типов с плавающей точкой
При инстанцировании с одним из неквалифицированных типов с плавающей точкой (float, double, long double и неквалифицированные типы с расширенной плавающей точкой extended floating-point types(с C++23)), std::atomic_ref предоставляет дополнительные атомарные операции, подходящие для типов с плавающей точкой, такие как fetch_add и fetch_sub.
Ни одна операция не приводит к неопределённому поведению, даже если результат не представим в типе с плавающей точкой. Среда с плавающей точкой, которая действует, может отличаться от среды с плавающей точкой вызывающей нити.
Типы членов
| Тип члена | Определение |
|---|---|
value_type | см. ниже |
difference_type | value_type (только для специализаций atomic_ref<Integral> и atomic_ref<Floating>)std::ptrdiff_t (только для специализаций std::atomic_ref<T*>) |
Для каждого std::atomic_ref<X> (специализирован или нет), std::atomic_ref<X>::value_type является X.
difference_type не определён в основном шаблоне atomic_ref.
Функции членов
создаёт объект atomic_ref (публичная функция-член) |
|
сохраняет значение в объект, на который ссылается объект atomic_ref (публичная функция-член) |
|
проверяет, является ли объект atomic_ref без блокировки (публичная функция-член) |
|
| атомарно заменяет значение объекта-ссылка на неатомарный аргумент (публичная функция-член) |
|
| атомарно получает значение объекта-ссылка (публичная функция-член) |
|
| загружает значение из объекта-ссылка (публичная функция-член) |
|
| атомарно заменяет значение объекта-ссылка и получает ранее хранимое значение (публичная функция-член) |
|
| атомарно сравнивает значение объекта-ссылка с неатомарным аргументом и выполняет атомарную замену, если они равны, или атомарное чтение, если нет (публичная функция-член) |
|
|
(C++20) | блокирует нить до уведомления и изменения атомарного значения (публичная функция-член) |
|
(C++20) | уведомляет хотя бы одну нить, ожидающую атомарный объект (публичная функция-член) |
|
(C++20) | уведомляет все нити, заблокированные в ожидании атомарного объекта (публичная функция-член) |
Константы |
|
|
[static] | указывает, что тип всегда без блокировки (публичная статическая константа) |
|
[static] | указывает требуемое выравнивание объекта, который должен быть сопоставлен с объектом atomic_ref (публичная статическая константа) |
Специализированные функции-члены
| атомарно добавляет аргумент к значению, хранящемуся в объекте-ссылке, и возвращает ранее хранившееся значение (публичный член-функция) |
|
| атомарно вычитает аргумент из значения, хранящегося в объекте-ссылке, и возвращает ранее хранившееся значение (публичный член-функция) |
|
| атомарно выполняет побитовое И между аргументом и значением объекта-ссылки и возвращает ранее хранившееся значение (публичный член-функция) |
|
| атомарно выполняет побитовое ИЛИ между аргументом и значением объекта-ссылки и возвращает ранее хранившееся значение (публичный член-функция) |
|
| атомарно выполняет побитовое ИСКЛЮЧАЮЩЕЕ ИЛИ между аргументом и значением объекта-ссылки и возвращает ранее хранившееся значение (публичный член-функция) |
|
| атомарно увеличивает или уменьшает объект-ссылку на единицу (публичный член-функция) |
|
| атомарно добавляет, вычитает или выполняет побитовые операции И, ИЛИ, ИСКЛЮЧАЮЩЕЕ ИЛИ со значением объекта-ссылки (публичный член-функция) |
Примечания
| Макрокоманда проверки наличия функции | Значение | Стандарт | Функция |
|---|---|---|---|
__cpp_lib_atomic_ref | 201806L | (C++20) |
std::atomic_ref |
См. также
|
(C++11) | шаблон класса atomic и специализации для bool, целочисленных, с плавающей точкой,(с C++20) и указательных типов (шаблон класса) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/atomic/atomic_ref