Spec-Zone.ru › C++

Библиотека поддержки конкурентного программирования (с C++11)

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

Потоки

Потоки позволяют программам выполняться на нескольких процессорных ядрах.

Определено в заголовке <thread>
thread
(C++11)
управляет отдельным потоком
(класс)
jthread
(C++20)
std::thread с поддержкой автоматического присоединения и отмены
(класс)
Функции управления текущим потоком
Определено в пространстве имен this_thread
yield
(C++11)
предполагает, что реализация перепланирует выполнение потоков
(функция)
get_id
(C++11)
возвращает идентификатор потока текущего потока
(функция)
sleep_for
(C++11)
приостанавливает выполнение текущего потока на заданный период времени
(функция)
sleep_until
(C++11)
приостанавливает выполнение текущего потока до заданного момента времени
(функция)

Отмена потока

Типы stop_XXX предназначены для включения отмены потока для std::jthread, хотя их также можно использовать независимо от std::jthread - например, для прерывания std::condition_variable_any функций ожидания или для реализации собственной системы управления потоками. Фактически, их даже не обязательно использовать для «остановки» чего-либо, но вместо этого их можно использовать для безопасного для потоков запуска одной или нескольких функций один раз, например.

Определено в заголовке <stop_token>
stop_token
(C++20)
интерфейс для запроса о том, была ли сделана запрос на отмену std::jthread
(класс)
stop_source
(C++20)
класс, представляющий запрос на остановку одного или нескольких std::jthread
(класс)
stop_callback
(C++20)
интерфейс для регистрации обратных вызовов при отмене std::jthread
(шаблон класса)
(с C++20)

Доступ к размеру кэша

Определено в заголовке <new>
hardware_destructive_interference_sizehardware_constructive_interference_size
(C++17)
минимальное смещение для избежания ложной совместности
максимальное смещение для повышения реальной совместности
(константа)

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

Эти компоненты предназначены для мелкозернистых атомных операций, позволяющих осуществлять бесключевое конкурентное программирование. Каждая атомная операция неделима по отношению к любой другой атомной операции, которая затрагивает тот же объект. Атомные объекты не содержат гонок данных.

Ни макрос _Atomic, ни какие-либо глобальные объявления в пространстве имен, не являющиеся макросами, не предоставляются заголовком стандартной библиотеки C++, кроме <stdatomic.h>.

(с C++23)
Определено в заголовке <atomic>
Атомарные типы
atomic
(C++11)
Атомарный шаблон класса и специализации для bool, целых, чисел с плавающей точкой,(начиная с C++20) и типов указателей
(шаблон класса)
atomic_ref
(C++20)
предоставляет атомарные операции над неатомарными объектами
(шаблон класса)
Операции над атомарными типами
atomic_is_lock_free
(C++11)
проверяет, являются ли операции атомарного типа без блокировок
(шаблон функции)
atomic_storeatomic_store_explicit
(C++11)(C++11)
атомарно заменяет значение атомарного объекта неатомарным аргументом
(шаблон функции)
atomic_loadatomic_load_explicit
(C++11)(C++11)
атомарно получает значение, хранящееся в атомарном объекте
(шаблон функции)
atomic_exchangeatomic_exchange_explicit
(C++11)(C++11)
атомарно заменяет значение атомарного объекта неатомарным аргументом и возвращает старое значение атомарного
(шаблон функции)
atomic_compare_exchange_weakatomic_compare_exchange_weak_explicitatomic_compare_exchange_strongatomic_compare_exchange_strong_explicit
(C++11)(C++11)(C++11)(C++11)
атомарно сравнивает значение атомарного объекта с неатомарным аргументом и выполняет атомарный обмен, если равно, или атомарную загрузку, если нет
(шаблон функции)
atomic_fetch_addatomic_fetch_add_explicit
(C++11)(C++11)
добавляет неатомарное значение к атомарному объекту и получает предыдущее значение атомарного
(шаблон функции)
atomic_fetch_subatomic_fetch_sub_explicit
(C++11)(C++11)
вычитает неатомарное значение из атомарного объекта и получает предыдущее значение атомарного
(шаблон функции)
atomic_fetch_andatomic_fetch_and_explicit
(C++11)(C++11)
заменяет атомарный объект результатом побитового И с неатомарным аргументом и получает предыдущее значение атомарного
(шаблон функции)
atomic_fetch_oratomic_fetch_or_explicit
(C++11)(C++11)
заменяет атомарный объект результатом побитового ИЛИ с неатомарным аргументом и получает предыдущее значение атомарного
(шаблон функции)
atomic_fetch_xoratomic_fetch_xor_explicit
(C++11)(C++11)
заменяет атомарный объект результатом побитового XOR с неатомарным аргументом и получает предыдущее значение атомарного
(шаблон функции)
atomic_waitatomic_wait_explicit
(C++20)(C++20)
блокирует поток до уведомления и изменения атомарного значения
(шаблон функции)
atomic_notify_one
(C++20)
уведомляет поток, заблокированный в atomic_wait
(шаблон функции)
atomic_notify_all
(C++20)
уведомляет все потоки, заблокированные в atomic_wait
(шаблон функции)
Тип флага и операции
atomic_flag
(C++11)
атомарный тип булевых значений без блокировок
(класс)
atomic_flag_test_and_setatomic_flag_test_and_set_explicit
(C++11)(C++11)
атомарно устанавливает флаг в true и возвращает его предыдущее значение
(функция)
atomic_flag_clearatomic_flag_clear_explicit
(C++11)(C++11)
атомарно устанавливает значение флага в false
(функция)
atomic_flag_testatomic_flag_test_explicit
(C++20)(C++20)
атомарно возвращает значение флага
(функция)
atomic_flag_waitatomic_flag_wait_explicit
(C++20)(C++20)
блокирует поток до уведомления и изменения флага
(функция)
atomic_flag_notify_one
(C++20)
уведомляет поток, заблокированный в atomic_flag_wait
(функция)
atomic_flag_notify_all
(C++20)
уведомляет все потоки, заблокированные в atomic_flag_wait
(функция)
Инициализация
atomic_init
(C++11)(устарело в C++20)
неатомарная инициализация объекта атомарного типа, созданного по умолчанию
(шаблон функции)
ATOMIC_VAR_INIT
(C++11)(устарело в C++20)
постоянная инициализация атомарной переменной со статической продолжительностью хранения
(макрос-функция)
ATOMIC_FLAG_INIT
(C++11)
инициализирует std::atomic_flag в значение false
(константа-макрос)
Порядок синхронизации памяти
memory_order
(C++11)
определяет ограничения порядка памяти для заданной атомарной операции
(перечисление)
kill_dependency
(C++11)
удаляет указанный объект из дерева зависимостей std::memory_order_consume
(шаблон функции)
atomic_thread_fence
(C++11)
универсальное примитивное барьерное средство синхронизации, зависящее от порядка памяти
(функция)
atomic_signal_fence
(C++11)
барьер между потоком и обработчиком сигнала, выполняемым в том же потоке
(функция)
Определено в заголовке <stdatomic.h>
Макросы совместимости с C
_Atomic
(C++23)
макрос совместимости, такой что _Atomic(T) идентичен std::atomic<T>
(макрос-функция)

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

Алгоритмы взаимного исключения предотвращают одновременный доступ нескольких потоков к общим ресурсам. Это предотвращает гонки данных и обеспечивает поддержку синхронизации между потоками.

Определено в заголовке <mutex>
mutex
(C++11)
предоставляет основные средства взаимного исключения
(класс)
timed_mutex
(C++11)
предоставляет средства взаимного исключения, которые реализуют блокировку с таймаутом
(класс)
recursive_mutex
(C++11)
предоставляет средства взаимного исключения, которые могут быть заблокированы рекурсивно одним и тем же потоком
(класс)
recursive_timed_mutex
(C++11)
предоставляет средства взаимного исключения, которые могут быть заблокированы рекурсивно одним и тем же потоком, и реализует блокировку с таймаутом
(класс)
Определено в заголовке <shared_mutex>
shared_mutex
(C++17)
предоставляет средства совместного взаимного исключения
(класс)
shared_timed_mutex
(C++14)
предоставляет средства совместного взаимного исключения и реализует блокировку с таймаутом
(класс)
Управление общими мьютексами
Определено в заголовке <mutex>
lock_guard
(C++11)
реализует оболочку владения мьютексом, основанную на строгом развороте области
(шаблон класса)
scoped_lock
(C++17)
оболочка RAII для нескольких мьютексов, предотвращающая тупики
(шаблон класса)
unique_lock
(C++11)
реализует оболочку владения мьютексом, которая может перемещаться
(шаблон класса)
shared_lock
(C++14)
реализует оболочку владения общим мьютексом, которая может перемещаться
(шаблон класса)
defer_lock_ttry_to_lock_tadopt_lock_t
(C++11)(C++11)(C++11)
тип тега, используемый для указания стратегии блокировки
(класс)
defer_locktry_to_lockadopt_lock
(C++11)(C++11)(C++11)
константы тегов, используемые для указания стратегии блокировки
(константа)
Общие алгоритмы блокировки
try_lock
(C++11)
попытка получить владение мьютексами посредством многократных вызовов try_lock
(шаблон функции)
lock
(C++11)
блокирует указанные мьютексы, блокируется, если какие-либо недоступны
(шаблон функции)
Вызов один раз
once_flag
(C++11)
вспомогательный объект, гарантирующий, что call_once вызывает функцию только один раз
(класс)
call_once
(C++11)
вызывает функцию только один раз, даже если вызывается из нескольких потоков
(шаблон функции)

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

Условная переменная — это примитив синхронизации, позволяющий множественным потокам взаимодействовать друг с другом. Он позволяет некоторому числу потоков ожидать (возможно, с таймаутом) уведомления от другого потока, что они могут продолжить выполнение. Условная переменная всегда связана с мьютексом.

Определено в заголовке <condition_variable>
condition_variable
(C++11)
предоставляет переменную условия, связанную с std::unique_lock
(класс)
condition_variable_any
(C++11)
предоставляет переменную условия, связанную с любым типом блокировки
(класс)
notify_all_at_thread_exit
(C++11)
планирует вызов notify_all для вызова, когда этот поток полностью завершен
(функция)
cv_status
(C++11)
перечисляет возможные результаты таймерных ожиданий переменных условия
(перечисление)

Семафоры

Семафор — это лёгкая примитивная синхронизация, используемая для ограничения одновременного доступа к общему ресурсу. Когда достаточно любого из них, семафор может быть эффективнее, чем переменная условия.

Определено в заголовке <semaphore>
counting_semaphore
(C++20)
семафор, который моделирует счетчик ресурсов, неотрицательный
(шаблон класса)
binary_semaphore
(C++20)
семафор, у которого только два состояния
(typedef)

Защёлки и барьеры

Защёлки и барьеры — это механизмы координации потоков, которые позволяют любому количеству потоков блокироваться до тех пор, пока не прибудет ожидаемое количество потоков. Защёлка не может быть повторно использована, в то время как барьер может использоваться многократно.

Определено в заголовке <latch>
latch
(C++20)
одноразовый барьер потоков
(класс)
Определено в заголовке <barrier>
barrier
(C++20)
многократно используемый барьер потоков
(шаблон класса)
(с C++20)

Будущие значения

Библиотека стандартных средств предоставляет возможности получения значений, возвращаемых и перехватывания исключений, которые выбрасываются асинхронными задачами (т.е. функциями, запущенными в отдельных потоках). Эти значения передаются в объединённом состоянии, в котором асинхронная задача может записать своё возвращаемое значение или сохранить исключение, которое может быть проверено, ожидаемо и иначе обработано другими потоками, которые содержат экземпляры std::future или std::shared_future, которые ссылаются на это объединённое состояние.

Определено в заголовке <future>
promise
(C++11)
хранит значение для асинхронного получения
(шаблон класса)
packaged_task
(C++11)
упаковывает функцию для хранения её возвращаемого значения для асинхронного получения
(шаблон класса)
future
(C++11)
ждёт значение, которое устанавливается асинхронно
(шаблон класса)
shared_future
(C++11)
ждёт значение (возможно, на которое ссылаются другие future) , которое устанавливается асинхронно
(шаблон класса)
async
(C++11)
выполняет функцию асинхронно (возможно, в новом потоке) и возвращает std::future , который будет содержать результат
(шаблон функции)
launch
(C++11)
определяет политику запуска для std::async
(перечисление)
future_status
(C++11)
определяет результаты таймерных ожиданий, выполняемых над std::future и std::shared_future
(перечисление)
Ошибки будущих значений
future_error
(C++11)
сообщает об ошибке, связанной с будущими значениями или обещаниями
(класс)
future_category
(C++11)
определяет категорию ошибки будущих значений
(функция)
future_errc
(C++11)
определяет коды ошибок будущих значений
(перечисление)

Безопасное освобождение

Техники безопасного освобождения чаще всего используются для прямого разрешения гонок доступа-удаления.

Механизм чтения-копирования-обновления
Определено в заголовке <rcu>
rcu_obj_base
(C++26)
позволяет защитить объект с помощью RCU
(шаблон класса)
rcu_domain
(C++26)
предоставляет области защиты RCU
(класс)
rcu_default_domain
(C++26)
возвращает ссылку на объект статической длительности типа std::rcu_domain
(функция)
rcu_synchronize
(C++26)
блокируется до разблокирования области защиты в области RCU
(функция)
rcu_barrier
(C++26)
может оценивать запланированные операции в области RCU и блокируется до завершения всех предыдущих оценок
(функция)
rcu_retire
(C++26)
планирует оценку указанной функции в области RCU, потенциально выделяет память и вызывает запланированные оценки
(шаблон функции)
Указатели рисков
Определено в заголовке <hazard_pointer>
hazard_pointer_obj_base
(C++26)
позволяет защитить объект от рисков
(шаблон класса)
hazard_pointer
(C++26)
указатель с одним пишущим потоком и множеством читающих потоков, который может принадлежать не более чем одному потоку в любой момент времени
(класс)
make_hazard_pointer
(C++26)
создает указатель риска
(функция)
(с C++26)

См. также

Документация C по Библиотеке поддержки конкуретности

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/thread

Spec-Zone.ru

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