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 невелика - можно изменить указуемое значение с помощью объекта const std::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; - Стандартные целочисленные типы со знаком:
signed char,short,int,longиlong long; - Стандартные целочисленные типы без знака:
unsigned char,unsigned short,unsigned int,unsigned longиunsigned long long; - Любые дополнительные целочисленные типы, необходимые для typedef‘ов в заголовке <cstdint>.
- Символьные типы
Знаковая целочисленная арифметика использует дополнение до двух; нет неопределённых результатов.
Специализации для типов с плавающей запятой
При создании экземпляра с одним из cv-неквалифицированных типов с плавающей запятой (float, double, long double и 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, целочисленных типов и указателей (шаблон класса) |