Spec-Zone.ru › C

Библиотека поддержки параллелизма

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

Эти возможности предоставляются опционально:

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

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

Потоки

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

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

Объявлено в заголовке <stdatomic.h>
Операции над атомарными типами
ATOMIC_BOOL_LOCK_FREEATOMIC_CHAR_LOCK_FREEATOMIC_CHAR8_T_LOCK_FREEATOMIC_CHAR16_T_LOCK_FREEATOMIC_CHAR32_T_LOCK_FREEATOMIC_WCHAR_T_LOCK_FREEATOMIC_SHORT_LOCK_FREEATOMIC_INT_LOCK_FREEATOMIC_LONG_LOCK_FREEATOMIC_LLONG_LOCK_FREEATOMIC_POINTER_LOCK_FREE
(C11)(C11)(C23)(C11)(C11)(C11)(C11)(C11)(C11)(C11)(C11)
указывает, что данный атомарный тип не требует блокировки
(макроконстанта)
atomic_is_lock_free
(C11)
указывает, требует ли атомарный объект блокировки
(функция)
atomic_storeatomic_store_explicit
(C11)
сохраняет значение в атомарном объекте
(функция)
atomic_loadatomic_load_explicit
(C11)
читает значение из атомарного объекта
(функция)
atomic_exchangeatomic_exchange_explicit
(C11)
обменивает значение на значение атомарного объекта
(функция)
atomic_compare_exchange_strongatomic_compare_exchange_strong_explicitatomic_compare_exchange_weakatomic_compare_exchange_weak_explicit
(C11)
обменивает значение атомарного объекта, если его старое значение совпадает с ожидаемым; в противном случае считывает старое значение
(функция)
atomic_fetch_addatomic_fetch_add_explicit
(C11)
атомарное сложение
(функция)
atomic_fetch_subatomic_fetch_sub_explicit
(C11)
атомарное вычитание
(функция)
atomic_fetch_oratomic_fetch_or_explicit
(C11)
атомарная побитовая операция ИЛИ
(функция)
atomic_fetch_xoratomic_fetch_xor_explicit
(C11)
атомарная побитовая операция исключающее ИЛИ
(функция)
atomic_fetch_andatomic_fetch_and_explicit
(C11)
атомарная побитовая операция И
(функция)
Тип флага и операции над ним
atomic_flag
(C11)
атомарный логический флаг, не требующий блокировки
(структура)
atomic_flag_test_and_setatomic_flag_test_and_set_explicit
(C11)
устанавливает atomic_flag в true и возвращает прежнее значение
(функция)
atomic_flag_clearatomic_flag_clear_explicit
(C11)
устанавливает atomic_flag в false
(функция)
Инициализация
atomic_init
(C11)
инициализирует существующий атомарный объект
(функция)
ATOMIC_VAR_INIT
(C11)(устарело в C17)(удалено в C23)
инициализирует новый атомарный объект
(макрос-функция)
ATOMIC_FLAG_INIT
(C11)
инициализирует новый atomic_flag
(макроконстанта)
Порядок синхронизации памяти
memory_order
(C11)
задаёт ограничения на порядок операций с памятью
(перечисление)
kill_dependency
(C11)
разрывает цепочку зависимостей для memory_order_consume
(макрос-функция)
atomic_thread_fence
(C11)
универсальная примитива синхронизации на основе барьера памяти, зависящая от порядка операций с памятью
(функция)
atomic_signal_fence
(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 идентификатор мьютекса
mtx_init
(C11)
создаёт мьютекс
(функция)
mtx_lock
(C11)
блокирует выполнение до получения блокировки мьютекса
(функция)
mtx_timedlock
(C11)
блокирует выполнение до получения блокировки мьютекса или истечения времени ожидания
(функция)
mtx_trylock
(C11)
блокирует мьютекс или возвращает управление без блокировки, если он уже заблокирован
(функция)
mtx_unlock
(C11)
снимает блокировку мьютекса
(функция)
mtx_destroy
(C11)
уничтожает мьютекс
(функция)
mtx_plainmtx_recursivemtx_timed
(C11)(C11)(C11)
задаёт тип мьютекса
(перечисление)
Однократный вызов
call_once
(C11)
вызывает функцию ровно один раз
(функция)

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

Объявлено в заголовке <threads.h>
cnd_t идентификатор условной переменной
cnd_init
(C11)
создаёт условную переменную
(функция)
cnd_signal
(C11)
разблокирует один поток, ожидающий условную переменную
(функция)
cnd_broadcast
(C11)
разблокирует все потоки, ожидающие условную переменную
(функция)
cnd_wait
(C11)
ожидает условную переменную
(функция)
cnd_timedwait
(C11)
ожидает условную переменную с ограничением по времени
(функция)
cnd_destroy
(C11)
уничтожает условную переменную
(функция)

Потоковое локальное хранилище

Объявлено в заголовке <threads.h>
thread_local
(C11)(удалено в C23)
удобный макрос для спецификатора класса хранения _Thread_local
(макрос-ключевое слово)
tss_t указатель на потокоспецифичное хранилище
TSS_DTOR_ITERATIONS
(C11)
максимальное количество вызовов деструкторов
(макроконстанта)
tss_dtor_t
(C11)
тип указателя на функцию void(*)(void*), используемый для деструктора TSS
(typedef)
tss_create
(C11)
создаёт указатель на потокоспецифичное хранилище с заданным деструктором
(функция)
tss_get
(C11)
читает данные из потокоспецифичного хранилища
(функция)
tss_set
(C11)
записывает данные в потокоспецифичное хранилище
(функция)
tss_delete
(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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API