Execution control library (since C++26)
Библиотека управления выполнением предоставляет фреймворк для управления асинхронным выполнением на общих ресурсах выполнения.
Библиотека стремится предоставить словарные типы для асинхронных операций и позволить построение графов выполнения задач простым, композируемым способом.
Содержание |
Общебиблиотечные определения
- Отправитель : Описание асинхронной работы, отправляемой на выполнение. Создает состояние операции (ниже).
-
- Отправители асинхронно "отправляют" свои результаты слушателям, называемым "получателями" (ниже).
- Отправители могут быть скомпонованы в графы задач с использованием обобщённых алгоритмов.
- Фабрики и адаптеры отправителей - это обобщённые алгоритмы, которые инкапсулируют распространённые асинхронные паттерны в объектах, удовлетворяющих концепции sender .
- Receiver : Обобщенный callback, который потребляет или "принимает" асинхронные результаты, производимые sender'ом.
-
- Получатели имеют три различных «канала», через которые отправитель может передавать результаты: успех, сбой и отмена, называемые «значение», «ошибка» и «остановка».
- Получатели предоставляют расширяемую среду выполнения: набор пар ключ/значение, которые потребитель может использовать для параметризации асинхронной операции.
- Состояние операции : Объект, содержащий состояние, необходимое для асинхронной операции.
-
- Отправитель и получатель соединяются при передаче в функцию std::execution::connect .
- Результатом соединения отправителя и получателя является состояние операции.
-
Работа не ставится в очередь на выполнение до тех пор, пока не будет вызван метод "
start" для состояния операции. - После запуска время жизни состояния операции не может завершиться до окончания асинхронной операции, и его адрес должен оставаться стабильным.
- Scheduler : Легковесный дескриптор контекста выполнения.
-
- Контекст выполнения - это источник асинхронного выполнения, такой как пул потоков или поток GPU.
- Планировщик - это фабрика для отправителя, который завершает своего получателя из потока выполнения, принадлежащего контексту выполнения.
Утилиты библиотеки
Концепции
Планировщики
|
Определено в заголовке
<execution>
|
|
|
Определено в пространстве имен
std::execution
|
|
|
(C++26)
|
указывает, что тип является планировщиком
(концепт) |
Отправители
|
Определено в заголовке
<execution>
|
|
|
Определено в пространстве имен
std::execution
|
|
|
(C++26)
|
определяет, что тип является отправителем
(концепт) |
|
(C++26)
|
определяет отправитель, который может создавать асинхронные операции для заданного типа связанного окружения
(концепт) |
|
(C++26)
|
определяет отправитель, который может соединяться с определенным типом получателя
(концепт) |
Приёмники
|
Определено в заголовочном файле
<execution>
|
|
|
Определено в пространстве имён
std::execution
|
|
|
(C++26)
|
указывает, что тип является receiver
(концепт) |
|
(C++26)
|
указывает, что тип является receiver для заданных сигнатур завершения
(концепт) |
Состояния операций
|
Определено в заголовочном файле
<execution>
|
|
|
Определено в пространстве имен
std::execution
|
|
|
(C++26)
|
указывает, что тип является состоянием операции
(концепт) |
Утилитарные компоненты
Контексты выполнения
|
Определено в заголовочном файле
<execution>
|
|
|
Определено в пространстве имен
std::execution
|
|
|
(C++26)
|
ресурс выполнения, содержащий потокобезопасную
MPSC
очередь задач и управляемый вручную цикл событий
(класс) |
Домены выполнения
|
Определено в заголовке
<execution>
|
|
|
Определено в пространстве имён
std::execution
|
|
|
(C++26)
|
теговый тип домена выполнения по умолчанию, который диспетчеризует преобразования из тега отправителя
(класс) |
|
(C++26)
|
преобразует в новый отправитель под заданным тегом домена выполнения
(шаблон функции) |
|
(C++26)
|
преобразует в новый запрашиваемый объект под заданным тегом домена выполнения
(шаблон функции) |
|
(C++26)
|
потребляет отправитель с использованием заданного тега потребителя отправителя с набором аргументов и возвращает его результат под заданным тегом домена выполнения
(шаблон функции) |
Гарантия прогресса выполнения
|
Определено в заголовочном файле
<execution>
|
|
|
Определено в пространстве имен
std::execution
|
|
|
определяет
гарантию продвижения вперед
агентов выполнения, созданных ассоциированным ресурсом выполнения планировщика
(перечисление) |
|
Окружения
|
Определено в заголовке
<execution>
|
|
|
Определено в пространстве имён
std::execution
|
|
|
(C++26)
|
создаёт запрашиваемый объект из объекта запроса и значения
(шаблон класса) |
|
(C++26)
|
агрегирует несколько запрашиваемых объектов в один запрашиваемый объект
(шаблон класса) |
|
(C++26)
|
возвращает ассоциированный запрашиваемый объект для данного аргумента
(объект точки настройки) |
Запросы
|
Определено в заголовочном файле
<execution>
|
|
|
(C++26)
|
запрашивает у объекта запроса, должен ли он быть перенаправлен через адаптеры с поддержкой запросов
(объект точки настройки) |
|
(C++26)
|
запрашивает у объекта с поддержкой запросов связанный с ним аллокатор
(объект точки настройки) |
|
(C++26)
|
запрашивает у объекта с поддержкой запросов связанный с ним токен остановки
(объект точки настройки) |
|
(C++26)
|
запрашивает у объекта с поддержкой запросов связанную с ним метку домена выполнения
(объект точки настройки) |
|
(C++26)
|
запрашивает у объекта с поддержкой запросов связанный с ним планировщик
(объект точки настройки) |
|
запрашивает у объекта с поддержкой запросов планировщик, который может быть использован для делегирования работы с целью делегирования прогресса выполнения
(объект точки настройки) |
|
|
получает планировщик завершения, связанный с меткой завершения из атрибутов отправителя
(объект точки настройки) |
|
|
запрашивает у планировщика информацию о его
execution::forward_progress_guarantee
(объект точки настройки) |
|
Сигнатуры завершения
|
Определено в заголовке
<execution>
|
|
|
Определено в пространстве имён
std::execution
|
|
|
(C++26)
|
тип, кодирующий набор сигнатур завершения
(шаблон класса) |
|
получает сигнатуры завершения отправителя
(объект точки настройки) |
|
|
преобразует один набор сигнатур завершения в другой
(псевдоним шаблона) |
|
|
преобразует сигнатуры завершения отправителя
(псевдоним шаблона) |
|
|
(C++26)
|
получает тип тега отправителя
(псевдоним шаблона) |
|
(C++26)
|
получает тип завершения значения отправителя
(псевдоним шаблона) |
|
(C++26)
|
получает тип завершения ошибки отправителя
(псевдоним шаблона) |
|
(C++26)
|
определяет, поддерживает ли отправитель завершение остановки
(шаблон переменной) |
Утилиты для корутин
|
Определено в заголовке
<execution>
|
|
|
Определено в пространстве имён
std::execution
|
|
|
(C++26)
|
преобразует выражение в awaitable объект внутри конкретной корутины
(объект точки настройки) |
|
при использовании в качестве базового класса типа promise корутины, позволяет senders быть awaitable внутри этого типа корутины
(шаблон класса) |
|
Основные операции
Состояние операции
|
Определено в заголовочном файле
<execution>
|
|
|
Определено в пространстве имён
std::execution
|
|
|
(C++26)
|
соединяет
sender
с
receiver
(объект точки кастомизации) |
|
(C++26)
|
запускает асинхронную операцию, связанную с объектом
operation_state
(объект точки кастомизации) |
Функции завершения
Эти функции вызываются отправителями для уведомления получателей о завершении работы.
|
Определено в заголовке
<execution>
|
|
|
Определено в пространстве имён
std::execution
|
|
|
(C++26)
|
функция завершения значения, указывающая на успешное завершение
(объект точки кастомизации) |
|
(C++26)
|
функция завершения ошибки, указывающая на возникновение ошибки во время вычисления или планирования
(объект точки кастомизации) |
|
(C++26)
|
функция завершения остановки, указывающая на завершение операции до достижения успеха или неудачи
(объект точки кастомизации) |
Алгоритмы отправителя
|
Этот раздел не завершён
Причина: ведётся обновление до текущего стандарта |
Фабрики отправителей
Фабрика отправителя — это функция, возвращающая отправитель, параметры которой имеют типы, для которых концепция
sender
является
false
.
Ниже приведены фабрики отправителей:
|
Определено в заголовке
<execution>
|
|
|
Определено в пространстве имён
std::execution
|
|
|
(C++26)
|
Принимает переменное число аргументов и возвращает отправитель, который при подключении и запуске завершается синхронно, передавая аргументы в функцию завершения значения получателя
(объект точки кастомизации) |
|
(C++26)
|
Принимает единственный аргумент и возвращает отправитель, который при подключении и запуске завершается синхронно, передавая аргумент в функцию завершения ошибки получателя
(объект точки кастомизации) |
|
(C++26)
|
создаёт отправитель, который завершается немедленно, вызывая
set_stopped
своего получателя
(объект точки кастомизации) |
|
(C++26)
|
создаёт отправитель, который запрашивает ассоциированное окружение своего получателя
(объект точки кастомизации) |
|
(C++26)
|
подготавливает граф задач для выполнения на заданном планировщике
(объект точки кастомизации) |
Конвейерные адаптеры отправителей
|
Определено в заголовочном файле
<execution>
|
|
|
Определено в пространстве имен
std::execution
|
|
|
вспомогательный базовый класс-шаблон для определения конвейерного объекта замыкания адаптера отправителя
(класс-шаблон) |
|
Адаптеры отправителей
Адаптер отправителя — это функция, возвращающая отправитель, параметры которой включают по крайней мере один, чей тип удовлетворяет концепции
sender
, и для которой возвращаемый отправитель является родительским отправителем для аргументов-отправителей функции-адаптера.
Ниже представлены адаптеры отправителя:
|
Определено в заголовочном файле
<execution>
|
|
|
Определено в пространстве имён
std::execution
|
|
|
(C++26)
|
адаптирует предоставленный отправитель в такой, который будет запускать выполнение на вычислительном ресурсе предоставленного планировщика
(объект точки кастомизации) |
|
(C++26)
|
адаптирует предоставленный отправитель в такой, который завершается на вычислительном ресурсе предоставленного планировщика
(объект точки кастомизации) |
|
(C++26)
|
адаптирует предоставленный отправитель для передачи выполнения в ресурс выполнения предоставленного планировщика, на котором работает отправитель или продолжение, а затем возвращает выполнение обратно в исходный ресурс
(объект точки настройки) |
|
(C++26)
|
планирует выполнение работы, зависящей от завершения предоставленного отправителя, на вычислительных ресурсах предоставленного планировщика
(объект точки кастомизации) |
|
(C++26)
|
связывает граф задач входного отправителя с узлом, представляющим вызов предоставленной функции со значениями, отправленными входным отправителем в качестве аргументов
(объект точки кастомизации) |
|
(C++26)
|
связывает граф задач с входным отправителем узлом, представляющим вызов предоставленной функции с ошибкой, отправленной входным отправителем, если произошла ошибка
(объект точки настройки) |
|
(C++26)
|
связывает граф задач входного отправителя с узлом, представляющим вызов предоставленной функции с поведением остановки входного отправителя, если отправлен сигнал "stopped"
(объект точки кастомизации) |
|
(C++26)
|
возвращает отправитель, который представляет узел, связанный с входным отправителем, который при запуске вызывает предоставленную функцию со значениями, отправленными входным отправителем, в качестве аргументов
(объект точки кастомизации) |
|
(C++26)
|
возвращает отправитель, который представляет узел, связанный с входным отправителем, который вызывает предоставленную функцию с ошибкой из входного отправителя, если она произошла
(объект точки кастомизации) |
|
(C++26)
|
возвращает отправитель, который представляет узел, связанный с входным отправителем, который вызывает предоставленную функцию с токеном остановки из входного отправителя, если отправлен сигнал "stopped"
(объект точки настройки) |
|
создает многократный отправитель, который вызывает функцию с каждым индексом в заданной форме вместе со значениями, отправленными входным отправителем. Отправитель завершается после завершения всех вызовов или при возникновении ошибки
(объект точки настройки) |
|
|
(C++26)
|
если предоставленный отправитель является многократным отправителем, возвращает этот отправитель, в противном случае возвращает многократный отправитель, который отправляет значения, эквивалентные значениям, отправленным предоставленным отправителем
(объект точки настройки) |
|
(C++26)
|
адаптирует несколько входных сендеров в сендер, который завершается после завершения всех входных сендеров
(объект точки кастомизации) |
|
(C++26)
|
адаптирует несколько входных отправителей, каждый из которых может иметь несколько сигнатур завершения, в отправитель, который завершается после завершения всех входных отправителей
(объект точки кастомизации) |
|
(C++26)
|
возвращает отправитель, который отправляет вариант кортежей всех возможных наборов типов, отправляемых входным отправителем
(объект точки кастомизации) |
|
(C++26)
|
возвращает отправитель, который отображает канал значений в
std::
optional
<
std::
decay_t
<
T
>>
и канал остановки в
std::
nullopt
(объект точки кастомизации) |
|
(C++26)
|
возвращает отправитель, который отображает остановленный канал в ошибку
(объект точки настройки) |
Потребители отправителей
Отправитель-потребитель — это алгоритм, который принимает один или несколько отправителей в качестве параметров и не возвращает отправитель.
|
Определено в заголовочном файле
<execution>
|
|
|
Определено в пространстве имён
std::this_thread
|
|
|
(C++26)
|
блокирует текущий поток до завершения указанного отправителя и возвращает его асинхронный результат
(объект точки кастомизации) |
|
блокирует текущий поток до завершения указанного отправителя с возможными множественными сигнатурами завершения и возвращает его асинхронный результат
(объект точки кастомизации) |
|
Пример
Версия этого примера доступна на godbolt.org , где используется stdexec , экспериментальная референсная реализация std::execution .
#include <cstdio> #include <execution> #include <string> #include <thread> #include <utility> using namespace std::literals; int main() { std::execution::run_loop loop; std::jthread worker([&](std::stop_token st) { std::stop_callback cb{st, [&]{ loop.finish(); }}; loop.run(); }); std::execution::sender auto hello = std::execution::just("hello world"s); std::execution::sender auto print = std::move(hello) | std::execution::then([](std::string msg) { return std::puts(msg.c_str()); }); std::execution::scheduler auto io_thread = loop.get_scheduler(); std::execution::sender auto work = std::execution::on(io_thread, std::move(print)); auto [result] = std::this_thread::sync_wait(std::move(work)).value(); return result; }
Вывод:
hello world
Смотрите также
|
(C++11)
|
запускает функцию асинхронно (потенциально в новом потоке) и возвращает
std::future
, который будет содержать результат
(шаблон функции) |