<atomic>

Определяет классы и шаблоны классов для создания типов, поддерживающих атомарные операции.

Синтаксис

#include <atomic>

Замечания

Примечание.

В коде, скомпилированном с помощью /clr:pureэтого заголовка, блокируется. Обе /clr:pure версии не /clr:safe рекомендуется использовать в Visual Studio 2017 и более поздних версиях.

Атомарная операция имеет два ключевых свойства, которые помогают использовать несколько потоков для правильного управления объектом без использования mutex блокировок.

  • Так как атомарная операция неразличима, вторая атомарная операция с тем же объектом из другого потока может получить состояние объекта только до или после первой атомарной операции.

  • На основе его memory_order аргумента атомарная операция устанавливает требования к упорядочению для видимости эффектов других атомарных операций в том же потоке. Следовательно, она подавляет оптимизации компилятора, которые нарушают требования к упорядоченности.

На некоторых платформах бывает невозможно эффективно реализовать атомарные операции для некоторых типов без использования блокировок mutex. Атомарный тип не является lock-free , если атомарные операции с этим типом не используют блокировки.

C++11: в обработчиках сигналов можно выполнять атомарные операции с объектом obj , если obj.is_lock_free() или atomic_is_lock_free(x) есть true.

atomic_flag Класс предоставляет минимальный атомарный тип, содержащий bool флаг. Его операции всегда являются неблокирующими.

Шаблон atomic<T> класса хранит объект своего типа T аргумента и предоставляет атомарный доступ к такому сохраненном значению. Его можно создать с помощью любого типа, который можно скопировать с помощью и memcpy проверить для равенства.memcmp В частности, его можно использовать с пользовательскими типами, которые соответствуют этим требованиям, и во многих случаях с типами с плавающей запятой.

Шаблон также имеет ряд специализаций для целочисленных типов и частичную специализацию для указателей. Эти специализации предоставляют дополнительные операции, недоступные в основном шаблоне.

Специализации для указателей

Частичные специализации atomic<T *> применяются для всех типов указателей. Они предоставляют методы для расчетов с указателями.

Специализации для целочисленных типов

Специализации atomic<integral> применяются для всех целочисленных типов. Они предоставляют дополнительные операции, недоступные через первичный шаблон.

Каждый тип atomic<integral> имеет соответствующий макрос, который можно использовать в if directive для определения во время компиляции, являются ли операции этого типа неблокирующими. Если значение макроса равно нулю, операции с типом не блокируются без блокировки. Если значение равно 1, операции могут быть неблокирующими, и требуется проверка времени выполнения. Если значение равно 2, операции являются неблокирующими. Вы можете использовать функцию atomic_is_lock_free для определения во время выполнения, являются ли операции с типом неблокирующими.

Для каждого целочисленного типа существует соответствующий именованный атомарный тип, который управляет объектом этого целочисленного типа. Каждый тип atomic_integral имеет тот же набор функций-членов, что и соответствующий экземпляр atomic<T>, и может быть передан в любую из атомарных функций, не являющихся членами.

Тип atomic_integral Целочисленный тип Макрос atomic_is_lock_free
atomic_char char ATOMIC_CHAR_LOCK_FREE
atomic_schar signed char ATOMIC_CHAR_LOCK_FREE
atomic_uchar unsigned char ATOMIC_CHAR_LOCK_FREE
atomic_char16_t char16_t ATOMIC_CHAR16_T_LOCK_FREE
atomic_char32_t char32_t ATOMIC_CHAR32_T_LOCK_FREE
atomic_wchar_t wchar_t ATOMIC_WCHAR_T_LOCK_FREE
atomic_short short ATOMIC_SHORT_LOCK_FREE
atomic_ushort unsigned short ATOMIC_SHORT_LOCK_FREE
atomic_int int ATOMIC_INT_LOCK_FREE
atomic_uint unsigned int ATOMIC_INT_LOCK_FREE
atomic_long long ATOMIC_LONG_LOCK_FREE
atomic_ulong unsigned long ATOMIC_LONG_LOCK_FREE
atomic_llong long long ATOMIC_LLONG_LOCK_FREE
atomic_ullong unsigned long long ATOMIC_LLONG_LOCK_FREE

Typedef имена существуют для специализаций атомарного шаблона для некоторых типов, определенных в заголовке <inttypes.h>.

Атомарный тип Typedef Name
atomic_int8_t atomic<int8_t>
atomic_uint8_t atomic<uint8_t>
atomic_int16_t atomic<int16_t>
atomic_uint16_t atomic<uint16_t>
atomic_int32_t atomic<int32_t>
atomic_uint32_t atomic<uint32_t>
atomic_int64_t atomic<int64_t>
atomic_uint64_t atomic<uint64_t>
atomic_int_least8_t atomic<int_least8_t>
atomic_uint_least8_t atomic<uint_least8_t>
atomic_int_least16_t atomic<int_least16_t>
atomic_uint_least16_t atomic<uint_least16_t>
atomic_int_least32_t atomic<int_least32_t>
atomic_uint_least32_t atomic<uint_least32_t>
atomic_int_least64_t atomic<int_least64_t>
atomic_uint_least64_t atomic<uint_least64_t>
atomic_int_fast8_t atomic<int_fast8_t>
atomic_uint_fast8_t atomic<uint_fast8_t>
atomic_int_fast16_t atomic<int_fast16_t>
atomic_uint_fast16_ atomic<uint_fast16_t>
atomic_int_fast32_t atomic<int_fast32_t>
atomic_uint_fast32_t atomic<uint_fast32_t>
atomic_int_fast64_t atomic<int_fast64_t>
atomic_uint_fast64_t atomic<uint_fast64_t>
atomic_intptr_t atomic<intptr_t>
atomic_uintptr_t atomic<uintptr_t>
atomic_size_t atomic<size_t>
atomic_ptrdiff_t atomic<ptrdiff_t>
atomic_intmax_t atomic<intmax_t>
atomic_uintmax_t atomic<uintmax_t>

Структуры

Имя Описание
atomic Структура Описывает объект, выполняющий atomic операции с хранимым значением.
atomic_flag Структура Описывает объект, который автоматически устанавливает и очищает флаг bool.

Перечисления

Имя Описание
memory_order Перечисления Предоставляет символьные имена для операций синхронизации в областях памяти. Эти операции влияют на то, как присвоения в одном потоке становятся видимыми в другом.

Функции

В следующем списке функции, которые не заканчиваются _explicit семантикой соответствующего _explicit, за исключением того, что они имеют неявные memory_order аргументы memory_order_seq_cst.

Имя Описание
atomic_compare_exchange_strong atomic compare and exchange Выполняет операцию.
atomic_compare_exchange_strong_explicit atomic compare and exchange Выполняет операцию.
atomic_compare_exchange_weak weak atomic compare and exchange Выполняет операцию.
atomic_compare_exchange_weak_explicit weak atomic compare and exchange Выполняет операцию.
atomic_exchange Заменяет сохраненное значение.
atomic_exchange_explicit Заменяет сохраненное значение.
atomic_fetch_add Добавляет указанное значение к существующему хранимому значению.
atomic_fetch_add_explicit Добавляет указанное значение к существующему хранимому значению.
atomic_fetch_and Выполняет битовое значение "and" (&) для указанного значения и существующего сохраненного значения.
atomic_fetch_and_explicit Выполняет битовое значение "and" (&) для указанного значения и существующего сохраненного значения.
atomic_fetch_or Выполняет битовое значение "или" (|) для указанного значения и существующего сохраненного значения.
atomic_fetch_or_explicit Выполняет битовое значение "или" (|) для указанного значения и существующего сохраненного значения.
atomic_fetch_sub Вычитает указанное значение из существующего хранимого значения.
atomic_fetch_sub_explicit Вычитает указанное значение из существующего хранимого значения.
atomic_fetch_xor Выполняет побитовое "эксклюзивное или" (^) значение указанного значения и существующее хранимое значение.
atomic_fetch_xor_explicit Выполняет побитовое "эксклюзивное или" (^) значение указанного значения и существующее хранимое значение.
atomic_flag_clear Устанавливает флаг в объекте atomic_flag в значение false.
atomic_flag_clear_explicit Устанавливает флаг в объекте atomic_flag в значение false.
atomic_flag_test_and_set Устанавливает флаг в объекте atomic_flag в значение true.
atomic_flag_test_and_set_explicit Устанавливает флаг в объекте atomic_flag в значение true.
atomic_init Задает сохраненное значение в объекте atomic.
atomic_is_lock_free Указывает, являются ли атомарные операции с указанным объектом неблокирующими.
atomic_load Атомарным образом получает значение.
atomic_load_explicit Атомарным образом получает значение.
atomic_signal_fence Действует как правило fence , которое устанавливает требования к упорядочению памяти между заборами в вызывающем потоке с обработчиками сигналов, выполняемыми в одном потоке.
atomic_store Атомарным образом сохраняет значение.
atomic_store_explicit Атомарным образом сохраняет значение.
atomic_thread_fence Действует в качестве fence того, что устанавливает требования к упорядочению памяти в отношении других заборов.
kill_dependency Разрывает возможную цепочку зависимостей.

См. также

Справочник по файлам заголовков
Справочник по стандартной библиотеке C++