Namespaces
Variants

Concurrency support library

From cppreference.net
< c

C++ включает встроенную поддержку потоков, атомарных операций, взаимных исключений, условных переменных и потоково-специфичных хранилищ.

Эти функции предоставляются опционально:

  • если компилятором определена макроконстанта __STDC_NO_THREADS__ , заголовок <threads.h> и все имена, предоставляемые в нём, недоступны;
  • если компилятором определена макроконстанта __STDC_NO_ATOMICS__ , заголовок <stdatomic.h> и все имена, предоставляемые в нём, недоступны.

См. также _Atomic спецификатор типа и квалификатор .

Содержание

Потоки

Определено в заголовочном файле <threads.h>
thrd_t определяемый реализацией полный объектный тип, идентифицирующий поток
создает поток
(функция)
проверяет, ссылаются ли два идентификатора на один и тот же поток
(функция)
получает идентификатор текущего потока
(функция)
приостанавливает выполнение вызывающего потока на заданный период времени
(функция)
отдает текущий квант времени
(функция)
завершает вызывающий поток
(функция)
отсоединяет поток
(функция)
блокируется до завершения потока
(функция)
указывает статус ошибки потока
(константа)
thrd_start_t
(C11)
typedef типа указателя на функцию int ( * ) ( void * ) , используемый thrd_create
(typedef)

Атомарные операции

Определено в заголовочном файле <stdatomic.h>
Операции над атомарными типами
указывает, что данный атомарный тип является безблокировочным
(макро-константа)
указывает, является ли атомарный объект свободным от блокировок
(функция)
сохраняет значение в атомарном объекте
(функция)
считывает значение из атомарного объекта
(функция)
обменивает значение со значением атомарного объекта
(функция)
заменяет значение атомарного объекта, если старое значение соответствует ожидаемому, в противном случае считывает старое значение
(функция)
атомарное сложение
(функция)
атомарное вычитание
(функция)
атомное побитовое ИЛИ
(функция)
атомическое побитовое исключающее ИЛИ
(функция)
атомное побитовое И
(функция)
Тип флага и операции
безблокирующий атомарный булевый флаг
(struct)
устанавливает atomic_flag в true и возвращает предыдущее значение
(функция)
устанавливает atomic_flag в false
(функция)
Инициализация
инициализирует существующий атомарный объект
(функция)
(C11) (устарело в C17) (удалено в C23)
инициализирует новый атомарный объект
(функция-макрос)
инициализирует новый atomic_flag
(макрос-константа)
Порядок синхронизации памяти
определяет ограничения упорядочения памяти
(enum)
разрывает цепочку зависимостей для memory_order_consume
(функциональный макрос)
универсальная примитивная синхронизация барьера, зависящая от порядка памяти
(функция)
барьер между потоком и обработчиком сигнала, выполняемым в том же потоке
(функция)
**Объяснение перевода:** - HTML-теги и атрибуты сохранены без изменений - Текст внутри тега ` ` не переведен (`atomic_uchar`) - Текст внутри тега ` ` не переведен, так как содержит C++ специфичные термины (`_Atomic unsigned char`) - Переведен только текст "(C11)" → "(C11)" (оставлен без изменений, так как это стандартная маркировка версии языка C) - Форматирование полностью сохранено **Объяснение перевода:** - HTML-теги и атрибуты сохранены без изменений - Текст внутри тега ` ` не переведен (`atomic_uint`) - C++ специфические термины не переведены (`_Atomic`, `unsigned`, `int`) - Только обычный текст переведен на русский: - "(C11)" остается без изменений (это стандартная маркировка версии C++) - Форматирование и структура HTML полностью сохранены **Примечание:** В данном случае весь текст уже является техническими терминами C++ и HTML-разметкой, поэтому перевод не требуется. Сохранена исходная структура и форматирование, как указано в требованиях. **Объяснение перевода:** - HTML-теги и атрибуты сохранены без изменений - Текст внутри тега ` ` не переведен (`atomic_llong`) - C++ специфические термины не переведены (`_Atomic`, `long long`) - Форматирование полностью сохранено - Только обычный текст переведен на русский язык **Примечание:** В данном случае весь текст, требующий перевода, уже находится внутри HTML-тегов, которые должны оставаться без изменений согласно вашим инструкциям. Единственный текст для перевода - это "(C11)", но он является частью атрибута класса и технического обозначения версии стандарта, поэтому также не должен переводиться. **Примечание:** В данном случае весь текст, который требовалось перевести, уже находится внутри HTML-тегов, которые должны оставаться неизменными (` `, ` `, ` `). Согласно вашим инструкциям: 1. HTML-теги и атрибуты не переводились 2. Текст внутри ` ` и `
` тегов не переводился
3. C++ специфические термины (`atomic_char32_t`, `_Atomic char32_t`) не переводились
4. Текст "(C11)" не требовал перевода, так как это версия стандарта
Таким образом, исходный HTML код остается полностью неизменным.
**Примечание:** В данном случае весь текст, который требовалось перевести, уже находится внутри HTML-тегов ` `, ` ` и является C++ специфическими терминами, поэтому перевод не выполнен в соответствии с вашими требованиями. Единственный текст вне защищенных тегов - "(C11)" - является стандартной маркировкой версии языка и также не подлежит переводу. **Примечание:** В данном случае весь текст, подлежащий переводу, уже находится внутри HTML-тегов, которые не должны переводиться (` `, ` `), либо представляет собой C++ специфичные термины (`atomic_int_least32_t`, `_Atomic`, `int_least32_t`), которые также не подлежат переводу согласно требованиям. Поэтому исходный HTML остается без изменений. **Примечание:** В данном случае весь текст, который требовалось перевести, уже находится внутри HTML-тегов ` ` и ` `, которые содержат технические термины C++ и не подлежат переводу согласно вашим требованиям. Единственный элемент, который мог бы быть переведен - "(C11)", но это стандартное обозначение версии языка, которое в технической документации обычно оставляют без перевода для сохранения однозначности. **Примечание:** В данном случае весь текст, который требовалось перевести, уже находится внутри HTML тегов, которые должны оставаться без изменений. Согласно вашим инструкциям: - HTML теги и атрибуты не переводятся - Текст внутри тегов ` `, `
`, `` не переводится
- C++ специфические термины не переводятся
Поэтому исходный HTML код остается без изменений.
**Перевод:** **Объяснение:** - Все HTML-теги и атрибуты сохранены без изменений - Текст внутри тегов ` ` и ` ` не переведен, так как содержит C++ специфичные термины - Форматирование полностью сохранено - Только не-C++ текст был переведен на русский язык
Псевдонимы типов для удобства
Имя типа-псевдонима Полное имя типа
atomic_bool (C11) _Atomic _Bool (до C23) _Atomic bool (начиная с C23)
atomic_char (C11) _Atomic char
atomic_schar (C11) _Atomic signed char
atomic_uchar (C11) _Atomic unsigned char
atomic_short (C11) _Atomic short
atomic_ushort (C11) _Atomic unsigned short
atomic_int (C11) _Atomic int
atomic_uint (C11) _Atomic unsigned int
atomic_long (C11) _Atomic long
atomic_ulong (C11) _Atomic unsigned long
atomic_llong (C11) _Atomic long long
atomic_ullong (C11) _Atomic unsigned long long
atomic_char8_t (C23) _Atomic char8_t
atomic_char16_t (C11) _Atomic char16_t
atomic_char32_t (C11) _Atomic char32_t
atomic_wchar_t (C11) _Atomic wchar_t
atomic_int_least8_t (C11) _Atomic int_least8_t
atomic_uint_least8_t (C11) _Atomic uint_least8_t
atomic_int_least16_t (C11) _Atomic int_least16_t
atomic_uint_least16_t (C11) _Atomic uint_least16_t
atomic_int_least32_t (C11) _Atomic int_least32_t
atomic_uint_least32_t (C11) _Atomic uint_least32_t
atomic_int_least64_t (C11) _Atomic int_least64_t
atomic_uint_least64_t (C11) _Atomic uint_least64_t
atomic_int_fast8_t (C11) _Atomic int_fast8_t
atomic_uint_fast8_t (C11) _Atomic uint_fast8_t
atomic_int_fast16_t (C11) _Atomic int_fast16_t
atomic_uint_fast16_t (C11) _Atomic uint_fast16_t
atomic_int_fast32_t (C11) _Atomic int_fast32_t
atomic_uint_fast32_t (C11) _Atomic uint_fast32_t
atomic_int_fast64_t (C11) _Atomic int_fast64_t
atomic_uint_fast64_t (C11) _Atomic uint_fast64_t
atomic_intptr_t (C11) _Atomic intptr_t
atomic_uintptr_t (C11) _Atomic uintptr_t
atomic_uintptr_t (C11) _Atomic uintptr_t
atomic_size_t (C11) _Atomic size_t
atomic_ptrdiff_t (C11) _Atomic ptrdiff_t
atomic_intmax_t (C11) _Atomic intmax_t
atomic_uintmax_t (C11) _Atomic uintmax_t

Взаимное исключение

Определено в заголовочном файле <threads.h>
mtx_t идентификатор мьютекса
создает мьютекс
(функция)
блокирует до захвата мьютекса
(функция)
блокирует до захвата мьютекса или истечения времени
(функция)
захватывает мьютекс или возвращает управление без блокировки, если уже захвачен
(функция)
освобождает мьютекс
(функция)
уничтожает мьютекс
(функция)
определяет тип мьютекса
(перечисление)
Однократный вызов
вызывает функцию ровно один раз
(функция)

Условные переменные

Определено в заголовочном файле <threads.h>
cnd_t идентификатор переменной условия
создает переменную условия
(функция)
разблокирует один поток, заблокированный на переменной условия
(функция)
разблокирует все потоки, заблокированные на переменной условия
(функция)
блокируется на переменной условия
(функция)
блокируется на переменной условия с таймаутом
(функция)
уничтожает переменную условия
(функция)

Тред-локальное хранилище

Определено в заголовочном файле <threads.h>
(C11) (удалено в C23)
удобный макрос для спецификатора класса хранения _Thread_local
(макрос-ключевое слово)
tss_t указатель на потоково-специфичное хранилище
максимальное количество вызовов деструкторов
(макрос-константа)
tss_dtor_t
(C11)
тип указателя на функцию void ( * ) ( void * ) , используемый для деструктора TSS
(typedef)
создает указатель на потоково-специфичное хранилище с заданным деструктором
(функция)
(C11)
читает из потоково-специфичного хранилища
(функция)
(C11)
записывает в потоково-специфичное хранилище
(функция)
освобождает ресурсы, удерживаемые заданным потоково-специфичным указателем
(функция)

Зарезервированные идентификаторы

В будущих редакциях стандарта C:

  • Имена функций, имена типов и константы перечислений, начинающиеся с cnd_ , mtx_ , thrd_ , или tss_ , и строчной буквы могут быть добавлены в объявления в заголовочном файле <threads.h> ;
  • Макросы, начинающиеся с ATOMIC_ и прописной буквы могут быть добавлены к макросам, определённым в заголовочном файле <stdatomic.h> ;
  • Имена типов, начинающиеся с atomic_ или memory_ , и строчной буквы могут быть добавлены в объявления в заголовочном файле <stdatomic.h> ;
  • Константы перечислений, начинающиеся с memory_order_ и строчной буквы могут быть добавлены в определение типа memory_order в заголовочном файле <stdatomic.h> ;
  • Имена функций, начинающиеся с atomic_ и строчной буквы могут быть добавлены в объявления в заголовочном файле <stdatomic.h> .

Идентификаторы, зарезервированные для имен функций, всегда потенциально (since C23) зарезервированы для использования в качестве идентификаторов с внешней линковкой, в то время как другие идентификаторы из этого списка потенциально (since C23) зарезервированы, когда <stdatomic.h> включен.

Объявление, определение или #undef такого идентификатора приводит к неопределённому поведению если он предоставляется стандартом или реализацией (начиная с C23) . Переносимые программы не должны использовать такие идентификаторы.

Ссылки

  • Стандарт C23 (ISO/IEC 9899:2024):
  • 7.17 Атомарные операции <stdatomic.h> (стр.: TBD)
  • 7.26 Потоки выполнения <threads.h> (стр.: TBD)
  • 7.31.8 Атомарные операции <stdatomic.h> (стр.: TBD)
  • 7.31.15 Потоки выполнения <threads.h> (стр.: TBD)
  • Стандарт C17 (ISO/IEC 9899:2018):
  • 7.17 Атомарные операции <stdatomic.h> (стр: 200-209)
  • 7.26 Потоки <threads.h> (стр: 274-283)
  • 7.31.8 Атомарные операции <stdatomic.h> (стр: 332)
  • 7.31.15 Потоки <threads.h> (стр: 333)
  • Стандарт C11 (ISO/IEC 9899:2011):
  • 7.17 Атомарные операции <stdatomic.h> (стр: 273-286)
  • 7.26 Потоки выполнения <threads.h> (стр: 376-387)
  • 7.31.8 Атомарные операции <stdatomic.h> (стр: 455-456)
  • 7.31.15 Потоки выполнения <threads.h> (стр: 456)

Смотрите также

C++ documentation для Concurrency support library

Внешние ссылки

GNU GCC Libc Manual: ISO C Mutexes