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)
псевдоним типа указателя на функцию int(*)(void*), используемый функцией thrd_create
(псевдоним)

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

Определено в заголовке <stdatomic.h>
Операции над атомными типами
ATOMIC_BOOL_LOCK_FREEATOMIC_CHAR_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)
указывает, что данный атомный тип является безблокирующим
(макроконстанта)
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)
устанавливает атомный флаг в true и возвращает старое значение
(функция)
atomic_flag_clearatomic_flag_clear_explicit
(C11)
устанавливает атомный флаг в 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)
барьер между потоком и обработчиком сигнала, выполняемым в том же потоке
(функция)
Удобные псевдонимы типов
Имя псевдонима Полное имя типа
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 идентификатор мьютекса
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: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

Spec-Zone.ru

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