<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++