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.
Как и для языковых ссылок, константность для 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_type | value_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 функция-элемент) | |
Константы | |
[static] | указывает, что тип всегда свободен от блокировок (public static константа-элемент) |
[static] | указывает необходимое выравнивание объекта, на который будет ссылаться atomic_ref (public static константа-элемент) |
[править]Специализированные функции-элементы
атомарно добавляет аргумент к значению, хранящемуся в указанном объекте, и получает значение, сохранённое ранее (public функция-элемент) | |
атомарно вычитает аргумент из значения, хранящегося в указанном объекте, и получает значение, сохранённое ранее (public функция-элемент) | |
атомарно выполняет побитовое И между аргументом и значением указанного объекта и получает значение, сохранённое ранее (public функция-элемент) | |
атомарно выполняет побитовое ИЛИ между аргументом и значением указанного объекта и получает значение, сохранённое ранее (public функция-элемент) | |
атомарно выполняет побитовое исключающее ИЛИ между аргументом и значением указанного объекта и получает значение, сохранённое ранее (public функция-элемент) | |
атомарно увеличивает или уменьшает указанный объект на единицу (public функция-элемент) | |
атомарно складывает, вычитает или выполняет побитовое И, ИЛИ, исключающее ИЛИ с указанным значением (public функция-элемент) |
[править]Примечание
Макрос Тестирования функциональности | Значение | Стандарт | Функциональность |
---|---|---|---|
__cpp_lib_atomic_ref | 201806L | (C++20) | std::atomic_ref |
[править]Смотрите также
(C++11) | шаблон класса atomic и его специализации для bool, целочисленных типов и указателей (шаблон класса) |