Библиотека поддержки конкурентного программирования (с C++11)
C++ включает встроенную поддержку потоков, атомных операций, взаимных исключений, условных переменных и фьючерсов.
Потоки
Потоки позволяют программам выполняться на нескольких процессорных ядрах.
Определено в заголовке <thread> |
|
|---|---|
|
(C++11) | управляет отдельным потоком (класс) |
|
(C++20) | std::thread с поддержкой автоматического присоединения и отмены (класс) |
Функции управления текущим потоком |
|
Определено в пространстве имен this_thread |
|
|
(C++11) | предполагает, что реализация перепланирует выполнение потоков (функция) |
|
(C++11) | возвращает идентификатор потока текущего потока (функция) |
|
(C++11) | приостанавливает выполнение текущего потока на заданный период времени (функция) |
|
(C++11) | приостанавливает выполнение текущего потока до заданного момента времени (функция) |
Отмена потокаТипы
| (с C++20) | ||||||||
Доступ к размеру кэша
Определено в заголовке <new> |
|
|---|---|
|
(C++17) | минимальное смещение для избежания ложной совместности максимальное смещение для повышения реальной совместности (константа) |
Атомные операции
Эти компоненты предназначены для мелкозернистых атомных операций, позволяющих осуществлять бесключевое конкурентное программирование. Каждая атомная операция неделима по отношению к любой другой атомной операции, которая затрагивает тот же объект. Атомные объекты не содержат гонок данных.
| Ни макрос | (с C++23) |
Определено в заголовке <atomic> |
|
|---|---|
Атомарные типы |
|
|
(C++11) | Атомарный шаблон класса и специализации для bool, целых, чисел с плавающей точкой,(начиная с C++20) и типов указателей (шаблон класса) |
|
(C++20) | предоставляет атомарные операции над неатомарными объектами (шаблон класса) |
Операции над атомарными типами |
|
|
(C++11) | проверяет, являются ли операции атомарного типа без блокировок (шаблон функции) |
|
(C++11)(C++11) | атомарно заменяет значение атомарного объекта неатомарным аргументом (шаблон функции) |
|
(C++11)(C++11) | атомарно получает значение, хранящееся в атомарном объекте (шаблон функции) |
|
(C++11)(C++11) | атомарно заменяет значение атомарного объекта неатомарным аргументом и возвращает старое значение атомарного (шаблон функции) |
|
(C++11)(C++11)(C++11)(C++11) | атомарно сравнивает значение атомарного объекта с неатомарным аргументом и выполняет атомарный обмен, если равно, или атомарную загрузку, если нет (шаблон функции) |
|
(C++11)(C++11) | добавляет неатомарное значение к атомарному объекту и получает предыдущее значение атомарного (шаблон функции) |
|
(C++11)(C++11) | вычитает неатомарное значение из атомарного объекта и получает предыдущее значение атомарного (шаблон функции) |
|
(C++11)(C++11) | заменяет атомарный объект результатом побитового И с неатомарным аргументом и получает предыдущее значение атомарного (шаблон функции) |
|
(C++11)(C++11) | заменяет атомарный объект результатом побитового ИЛИ с неатомарным аргументом и получает предыдущее значение атомарного (шаблон функции) |
|
(C++11)(C++11) | заменяет атомарный объект результатом побитового XOR с неатомарным аргументом и получает предыдущее значение атомарного (шаблон функции) |
|
(C++20)(C++20) | блокирует поток до уведомления и изменения атомарного значения (шаблон функции) |
|
(C++20) | уведомляет поток, заблокированный в atomic_wait (шаблон функции) |
|
(C++20) | уведомляет все потоки, заблокированные в atomic_wait (шаблон функции) |
Тип флага и операции |
|
|
(C++11) | атомарный тип булевых значений без блокировок (класс) |
|
(C++11)(C++11) | атомарно устанавливает флаг в true и возвращает его предыдущее значение (функция) |
|
(C++11)(C++11) | атомарно устанавливает значение флага в false (функция) |
|
(C++20)(C++20) | атомарно возвращает значение флага (функция) |
|
(C++20)(C++20) | блокирует поток до уведомления и изменения флага (функция) |
|
(C++20) | уведомляет поток, заблокированный в atomic_flag_wait (функция) |
|
(C++20) | уведомляет все потоки, заблокированные в atomic_flag_wait (функция) |
Инициализация |
|
|
(C++11)(устарело в C++20) | неатомарная инициализация объекта атомарного типа, созданного по умолчанию (шаблон функции) |
|
(C++11)(устарело в C++20) | постоянная инициализация атомарной переменной со статической продолжительностью хранения (макрос-функция) |
|
(C++11) | инициализирует std::atomic_flag в значение false (константа-макрос) |
Порядок синхронизации памяти |
|
|
(C++11) | определяет ограничения порядка памяти для заданной атомарной операции (перечисление) |
|
(C++11) | удаляет указанный объект из дерева зависимостей std::memory_order_consume (шаблон функции) |
|
(C++11) | универсальное примитивное барьерное средство синхронизации, зависящее от порядка памяти (функция) |
|
(C++11) | барьер между потоком и обработчиком сигнала, выполняемым в том же потоке (функция) |
Определено в заголовке <stdatomic.h> |
|
|---|---|
Макросы совместимости с C |
|
|
(C++23) | макрос совместимости, такой что _Atomic(T) идентичен std::atomic<T> (макрос-функция) |
Взаимное исключение
Алгоритмы взаимного исключения предотвращают одновременный доступ нескольких потоков к общим ресурсам. Это предотвращает гонки данных и обеспечивает поддержку синхронизации между потоками.
Определено в заголовке <mutex> |
|
|---|---|
|
(C++11) | предоставляет основные средства взаимного исключения (класс) |
|
(C++11) | предоставляет средства взаимного исключения, которые реализуют блокировку с таймаутом (класс) |
|
(C++11) | предоставляет средства взаимного исключения, которые могут быть заблокированы рекурсивно одним и тем же потоком (класс) |
|
(C++11) | предоставляет средства взаимного исключения, которые могут быть заблокированы рекурсивно одним и тем же потоком, и реализует блокировку с таймаутом (класс) |
Определено в заголовке <shared_mutex> |
|
|
(C++17) | предоставляет средства совместного взаимного исключения (класс) |
|
(C++14) | предоставляет средства совместного взаимного исключения и реализует блокировку с таймаутом (класс) |
Управление общими мьютексами |
|
Определено в заголовке <mutex> |
|
|
(C++11) | реализует оболочку владения мьютексом, основанную на строгом развороте области (шаблон класса) |
|
(C++17) | оболочка RAII для нескольких мьютексов, предотвращающая тупики (шаблон класса) |
|
(C++11) | реализует оболочку владения мьютексом, которая может перемещаться (шаблон класса) |
|
(C++14) | реализует оболочку владения общим мьютексом, которая может перемещаться (шаблон класса) |
|
(C++11)(C++11)(C++11) | тип тега, используемый для указания стратегии блокировки (класс) |
|
(C++11)(C++11)(C++11) | константы тегов, используемые для указания стратегии блокировки (константа) |
Общие алгоритмы блокировки |
|
|
(C++11) | попытка получить владение мьютексами посредством многократных вызовов try_lock (шаблон функции) |
|
(C++11) | блокирует указанные мьютексы, блокируется, если какие-либо недоступны (шаблон функции) |
Вызов один раз |
|
|
(C++11) | вспомогательный объект, гарантирующий, что call_once вызывает функцию только один раз (класс) |
|
(C++11) | вызывает функцию только один раз, даже если вызывается из нескольких потоков (шаблон функции) |
Условные переменные
Условная переменная — это примитив синхронизации, позволяющий множественным потокам взаимодействовать друг с другом. Он позволяет некоторому числу потоков ожидать (возможно, с таймаутом) уведомления от другого потока, что они могут продолжить выполнение. Условная переменная всегда связана с мьютексом.
Определено в заголовке <condition_variable> |
|
|---|---|
|
(C++11) | предоставляет переменную условия, связанную с std::unique_lock (класс) |
|
(C++11) | предоставляет переменную условия, связанную с любым типом блокировки (класс) |
|
(C++11) | планирует вызов notify_all для вызова, когда этот поток полностью завершен (функция) |
|
(C++11) | перечисляет возможные результаты таймерных ожиданий переменных условия (перечисление) |
СемафорыСемафор — это лёгкая примитивная синхронизация, используемая для ограничения одновременного доступа к общему ресурсу. Когда достаточно любого из них, семафор может быть эффективнее, чем переменная условия.
Защёлки и барьерыЗащёлки и барьеры — это механизмы координации потоков, которые позволяют любому количеству потоков блокироваться до тех пор, пока не прибудет ожидаемое количество потоков. Защёлка не может быть повторно использована, в то время как барьер может использоваться многократно.
| (с C++20) | ||||||||||||||
Будущие значения
Библиотека стандартных средств предоставляет возможности получения значений, возвращаемых и перехватывания исключений, которые выбрасываются асинхронными задачами (т.е. функциями, запущенными в отдельных потоках). Эти значения передаются в объединённом состоянии, в котором асинхронная задача может записать своё возвращаемое значение или сохранить исключение, которое может быть проверено, ожидаемо и иначе обработано другими потоками, которые содержат экземпляры std::future или std::shared_future, которые ссылаются на это объединённое состояние.
Определено в заголовке <future> |
|
|---|---|
|
(C++11) | хранит значение для асинхронного получения (шаблон класса) |
|
(C++11) | упаковывает функцию для хранения её возвращаемого значения для асинхронного получения (шаблон класса) |
|
(C++11) | ждёт значение, которое устанавливается асинхронно (шаблон класса) |
|
(C++11) | ждёт значение (возможно, на которое ссылаются другие future) , которое устанавливается асинхронно (шаблон класса) |
|
(C++11) | выполняет функцию асинхронно (возможно, в новом потоке) и возвращает std::future , который будет содержать результат (шаблон функции) |
|
(C++11) | определяет политику запуска для std::async (перечисление) |
|
(C++11) | определяет результаты таймерных ожиданий, выполняемых над std::future и std::shared_future (перечисление) |
Ошибки будущих значений |
|
|
(C++11) | сообщает об ошибке, связанной с будущими значениями или обещаниями (класс) |
|
(C++11) | определяет категорию ошибки будущих значений (функция) |
|
(C++11) | определяет коды ошибок будущих значений (перечисление) |
Безопасное освобождениеТехники безопасного освобождения чаще всего используются для прямого разрешения гонок доступа-удаления.
| (с C++26) | ||||||||||||||||||||||||||
См. также
| Документация C по Библиотеке поддержки конкуретности |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/thread