Библиотека поддержки параллелизма
В языке 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) | typedef типа указателя на функцию int(*)(void*), используемый в thrd_create (typedef) |
Атомарные операции
Объявлено в заголовке <stdatomic.h> |
|
|---|---|
Операции над атомарными типами |
|
|
(C11)(C11)(C23)(C11)(C11)(C11)(C11)(C11)(C11)(C11)(C11) | указывает, что данный атомарный тип не требует блокировки (макроконстанта) |
|
(C11) | указывает, требует ли атомарный объект блокировки (функция) |
|
(C11) | сохраняет значение в атомарном объекте (функция) |
|
(C11) | читает значение из атомарного объекта (функция) |
|
(C11) | обменивает значение на значение атомарного объекта (функция) |
|
(C11) | обменивает значение атомарного объекта, если его старое значение совпадает с ожидаемым; в противном случае считывает старое значение (функция) |
|
(C11) | атомарное сложение (функция) |
|
(C11) | атомарное вычитание (функция) |
|
(C11) | атомарная побитовая операция ИЛИ (функция) |
|
(C11) | атомарная побитовая операция исключающее ИЛИ (функция) |
|
(C11) | атомарная побитовая операция И (функция) |
Тип флага и операции над ним |
|
|
(C11) | атомарный логический флаг, не требующий блокировки (структура) |
|
(C11) | устанавливает atomic_flag в true и возвращает прежнее значение (функция) |
|
(C11) | устанавливает atomic_flag в false (функция) |
Инициализация |
|
|
(C11) | инициализирует существующий атомарный объект (функция) |
|
(C11)(устарело в C17)(удалено в C23) | инициализирует новый атомарный объект (макрос-функция) |
|
(C11) | инициализирует новый atomic_flag (макроконстанта) |
Порядок синхронизации памяти |
|
|
(C11) | задаёт ограничения на порядок операций с памятью (перечисление) |
|
(C11) | разрывает цепочку зависимостей для memory_order_consume (макрос-функция) |
|
(C11) | универсальная примитива синхронизации на основе барьера памяти, зависящая от порядка операций с памятью (функция) |
|
(C11) | барьер между потоком и обработчиком сигнала, выполняемым в том же потоке (функция) |
Удобные псевдонимы типов |
|
| Имя typedef | Полное имя типа |
|---|---|
atomic_bool (C11) | _Atomic_Bool(до C23)_Atomicbool(начиная с C23) |
atomic_char (C11) | _Atomicchar |
atomic_schar (C11) | _Atomicsignedchar |
atomic_uchar (C11) | _Atomicunsignedchar |
atomic_short (C11) | _Atomicshort |
atomic_ushort (C11) | _Atomicunsignedshort |
atomic_int (C11) | _Atomicint |
atomic_uint (C11) | _Atomicunsignedint |
atomic_long (C11) | _Atomiclong |
atomic_ulong (C11) | _Atomicunsignedlong |
atomic_llong (C11) | _Atomiclonglong |
atomic_ullong (C11) | _Atomicunsignedlonglong |
atomic_char8_t (C23) | _Atomicchar8_t |
atomic_char16_t (C11) | _Atomicchar16_t |
atomic_char32_t (C11) | _Atomicchar32_t |
atomic_wchar_t (C11) | _Atomicwchar_t |
atomic_int_least8_t (C11) | _Atomicint_least8_t |
atomic_uint_least8_t (C11) | _Atomicuint_least8_t |
atomic_int_least16_t (C11) | _Atomicint_least16_t |
atomic_uint_least16_t (C11) | _Atomicuint_least16_t |
atomic_int_least32_t (C11) | _Atomicint_least32_t |
atomic_uint_least32_t (C11) | _Atomicuint_least32_t |
atomic_int_least64_t (C11) | _Atomicint_least64_t |
atomic_uint_least64_t (C11) | _Atomicuint_least64_t |
atomic_int_fast8_t (C11) | _Atomicint_fast8_t |
atomic_uint_fast8_t (C11) | _Atomicuint_fast8_t |
atomic_int_fast16_t (C11) | _Atomicint_fast16_t |
atomic_uint_fast16_t (C11) | _Atomicuint_fast16_t |
atomic_int_fast32_t (C11) | _Atomicint_fast32_t |
atomic_uint_fast32_t (C11) | _Atomicuint_fast32_t |
atomic_int_fast64_t (C11) | _Atomicint_fast64_t |
atomic_uint_fast64_t (C11) | _Atomicuint_fast64_t |
atomic_intptr_t (C11) | _Atomicintptr_t |
atomic_uintptr_t (C11) | _Atomicuintptr_t |
atomic_size_t (C11) | _Atomicsize_t |
atomic_ptrdiff_t (C11) | _Atomicptrdiff_t |
atomic_intmax_t (C11) | _Atomicintmax_t |
atomic_uintmax_t (C11) | _Atomicuintmax_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: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++ для библиотеки поддержки параллелизма |
Внешние ссылки
| Руководство GNU GCC Libc: мьютексы ISO C |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/c/thread