Библиотека поддержки конкурентности
C включает встроенную поддержку потоков, атомарных операций, взаимных исключений, условных переменных и хранилищ, специфичных для потоков.
Эти функции предоставляются по желанию:
- если макроконстанта
__STDC_NO_THREADS__определена компилятором, заголовок<threads.h>и все имена, указанные в нём, не предоставляются; - если макроконстанта
__STDC_NO_ATOMICS__определена компилятором, заголовок<stdatomic.h>и все имена, указанные в нём, не предоставляются.
См. также _Atomic спецификатор и квалификатор типа.
Потоки
Определено в заголовке <threads.h> |
|
|---|---|
thrd_t | тип объекта, определяющий поток, — тип объекта, полностью определяемый реализацией. |
|
(C11) | создаёт поток (функция) |
|
(C11) | проверяет, ссылаются ли два идентификатора на один и тот же поток (функция) |
|
(C11) | получает идентификатор текущего потока (функция) |
|
(C11) | приостанавливает выполнение вызывающего потока на заданный период времени (функция) |
|
(C11) | уступает текущий квант времени (функция) |
|
(C11) | завершает вызывающий поток (функция) |
|
(C11) | отсоединяет поток (функция) |
|
(C11) | ожидает завершения потока (функция) |
|
(C11) | указывает код ошибки потока (константа) |
| thrd_start_t
(C11) | псевдоним типа указателя на функцию int(*)(void*), используемый функцией thrd_create (псевдоним) |
Атомарные операции
Определено в заголовке <stdatomic.h> |
|
|---|---|
Операции над атомными типами |
|
|
(C11) | указывает, что данный атомный тип является безблокирующим (макроконстанта) |
|
(C11) | указывает, является ли атомный объект безблокирующим (функция) |
|
(C11) | сохраняет значение в атомном объекте (функция) |
|
(C11) | считывает значение из атомного объекта (функция) |
|
(C11) | меняет значение с значением атомного объекта (функция) |
|
(C11) | меняет значение с атомным объектом, если старое значение соответствует ожидаемому, иначе считывает старое значение (функция) |
|
(C11) | атомное сложение (функция) |
|
(C11) | атомное вычитание (функция) |
|
(C11) | атомное побитовое ИЛИ (функция) |
|
(C11) | атомное побитовое исключающее ИЛИ (функция) |
|
(C11) | атомное побитовое И (функция) |
Тип флага и операции |
|
|
(C11) | безблокирующий атомный булевый флаг (структура) |
|
(C11) | устанавливает атомный флаг в true и возвращает старое значение (функция) |
|
(C11) | устанавливает атомный флаг в false (функция) |
Инициализация |
|
|
(C11) | инициализирует существующий атомный объект (функция) |
|
(C11)(устарело в C17)(удалено в C23) | инициализирует новый атомный объект (функция-макрос) |
|
(C11) | инициализирует новый atomic_flag (макроконстанта) |
Порядок синхронизации памяти |
|
|
(C11) | определяет ограничения порядка памяти (перечисление) |
|
(C11) | прерывает цепочку зависимостей для memory_order_consume (функция-макрос) |
|
(C11) | универсальная примитивная синхронизации барьера, зависящая от порядка памяти (функция) |
|
(C11) | барьер между потоком и обработчиком сигнала, выполняемым в том же потоке (функция) |
Удобные псевдонимы типов |
|
| Имя псевдонима | Полное имя типа |
atomic_bool(C11) | _Atomic _Bool |
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_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 | идентификатор мьютекса |
|
(C11) | создаёт мьютекс (функция) |
|
(C11) | блокируется, пока не заблокирует мьютекс (функция) |
|
(C11) | блокируется, пока не заблокирует мьютекс или истечёт время ожидания (функция) |
|
(C11) | блокирует мьютекс или возвращает без блокировки, если он уже заблокирован (функция) |
|
(C11) | разблокирует мьютекс (функция) |
|
(C11) | уничтожает мьютекс (функция) |
|
(C11)(C11)(C11) | определяет тип мьютекса (перечисление) |
Вызов один раз |
|
|
(C11) | вызывает функцию ровно один раз (функция) |
Условные переменные
Определено в заголовке <threads.h> |
|
|---|---|
cnd_t | идентификатор условной переменной |
|
(C11) | создаёт условную переменную (функция) |
|
(C11) | разблокирует один поток, заблокированный на условной переменной (функция) |
|
(C11) | разблокирует все потоки, заблокированные на условной переменной (функция) |
|
(C11) | блокируется на условной переменной (функция) |
|
(C11) | блокируется на условной переменной с таймаутом (функция) |
|
(C11) | уничтожает условную переменную (функция) |
Хранилище локальных данных потока
Определено в заголовке <threads.h> |
|
|---|---|
|
(C11)(удалено в C23) | удобная макрокоманда для спецификатора класса хранения _Thread_local (макрокоманда-ключевое слово) |
tss_t | указатель на хранилище, специфичное для потока |
|
(C11) | максимальное число вызовов деструкторов (константа макроса) |
tss_dtor_t(C11) | тип указателя на функцию void(*)(void*), используемый для деструктора TSS (typedef) |
|
(C11) | создаёт указатель на хранилище, специфичное для потока, с заданным деструктором (функция) |
|
(C11) | считывает данные из хранилища, специфичного для потока (функция) |
|
(C11) | запись в хранилище, специфичное для потока (функция) |
|
(C11) | освобождает ресурсы, удерживаемые данным указателем, специфичным для потока (функция) |
Зарезервированные идентификаторы
В будущих редакциях стандарта C:
- имена функций, имена типов и константы перечислений, начинающиеся с
cnd_,mtx_,thrd_, илиtss_, и строчной буквы, могут быть добавлены к объявлениям в заголовке<threads.h>; - макросы, начинающиеся с
ATOMIC_и заглавной буквы, могут быть добавлены к макросам, определённым в заголовке<stdatomic.h>; - имена typedef, начинающиеся с
atomic_илиmemory_, и строчной буквы, могут быть добавлены к объявлениям в заголовке<stdatomic.h>; - константы перечислений, начинающиеся с
memory_order_и строчной буквы, могут быть добавлены к определению типаmemory_orderв заголовке<stdatomic.h>; - имена функций, начинающиеся с
atomic_и строчной буквы, могут быть добавлены к объявлениям в заголовке<stdatomic.h>.
Идентификаторы, зарезервированные для имён функций, всегда потенциально(с C23) зарезервированы для использования в качестве идентификаторов с внешней связью, в то время как другие перечисленные здесь идентификаторы потенциально(с C23) зарезервированы при включении <stdatomic.h>.
Объявление, определение или #undef такого идентификатора приводит к неопределённому поведению если он предоставляется стандартом или реализацией(с C23). Переносимые программы не должны использовать эти идентификаторы.
Ссылки
- Стандарт C23 (ISO/IEC 9899:2023):
- 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++ для библиотеки поддержки конкурентности |
Внешние ссылки
| Руководство по GNU GCC Libc: ISO C Mutexes |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/thread