Namespaces
Variants

Execution control library (since C++26)

From cppreference.net

Библиотека управления выполнением предоставляет фреймворк для управления асинхронным выполнением на общих ресурсах выполнения.

Библиотека стремится предоставить словарные типы для асинхронных операций и позволить построение графов выполнения задач простым, композируемым способом.

Содержание

Общебиблиотечные определения

  • Отправитель : Описание асинхронной работы, отправляемой на выполнение. Создает состояние операции (ниже).
  • Отправители асинхронно "отправляют" свои результаты слушателям, называемым "получателями" (ниже).
  • Отправители могут быть скомпонованы в графы задач с использованием обобщённых алгоритмов.
  • Фабрики и адаптеры отправителей - это обобщённые алгоритмы, которые инкапсулируют распространённые асинхронные паттерны в объектах, удовлетворяющих концепции sender .
  • Receiver : Обобщенный callback, который потребляет или "принимает" асинхронные результаты, производимые sender'ом.
  • Получатели имеют три различных «канала», через которые отправитель может передавать результаты: успех, сбой и отмена, называемые «значение», «ошибка» и «остановка».
  • Получатели предоставляют расширяемую среду выполнения: набор пар ключ/значение, которые потребитель может использовать для параметризации асинхронной операции.
  • Состояние операции : Объект, содержащий состояние, необходимое для асинхронной операции.
  • Отправитель и получатель соединяются при передаче в функцию std::execution::connect .
  • Результатом соединения отправителя и получателя является состояние операции.
  • Работа не ставится в очередь на выполнение до тех пор, пока не будет вызван метод " start " для состояния операции.
  • После запуска время жизни состояния операции не может завершиться до окончания асинхронной операции, и его адрес должен оставаться стабильным.
  • Scheduler : Легковесный дескриптор контекста выполнения.
  • Контекст выполнения - это источник асинхронного выполнения, такой как пул потоков или поток GPU.
  • Планировщик - это фабрика для отправителя, который завершает своего получателя из потока выполнения, принадлежащего контексту выполнения.

Утилиты библиотеки

Концепции

Планировщики

Определено в заголовке <execution>
Определено в пространстве имен std::execution
указывает, что тип является планировщиком
(концепт)

Отправители

Определено в заголовке <execution>
Определено в пространстве имен std::execution
определяет, что тип является отправителем
(концепт)
определяет отправитель, который может создавать асинхронные операции для заданного типа связанного окружения
(концепт)
определяет отправитель, который может соединяться с определенным типом получателя
(концепт)

Приёмники

Определено в заголовочном файле <execution>
Определено в пространстве имён std::execution
указывает, что тип является receiver
(концепт)
указывает, что тип является receiver для заданных сигнатур завершения
(концепт)

Состояния операций

Определено в заголовочном файле <execution>
Определено в пространстве имен std::execution
указывает, что тип является состоянием операции
(концепт)

Утилитарные компоненты

Контексты выполнения

Определено в заголовочном файле <execution>
Определено в пространстве имен std::execution
ресурс выполнения, содержащий потокобезопасную MPSC очередь задач и управляемый вручную цикл событий
(класс)

Домены выполнения

Определено в заголовке <execution>
Определено в пространстве имён std::execution
теговый тип домена выполнения по умолчанию, который диспетчеризует преобразования из тега отправителя
(класс)
преобразует в новый отправитель под заданным тегом домена выполнения
(шаблон функции)
преобразует в новый запрашиваемый объект под заданным тегом домена выполнения
(шаблон функции)
потребляет отправитель с использованием заданного тега потребителя отправителя с набором аргументов и возвращает его результат под заданным тегом домена выполнения
(шаблон функции)

Гарантия прогресса выполнения

Определено в заголовочном файле <execution>
Определено в пространстве имен std::execution
определяет гарантию продвижения вперед агентов выполнения, созданных ассоциированным ресурсом выполнения планировщика
(перечисление)

Окружения

Определено в заголовке <execution>
Определено в пространстве имён std::execution
создаёт запрашиваемый объект из объекта запроса и значения
(шаблон класса)
агрегирует несколько запрашиваемых объектов в один запрашиваемый объект
(шаблон класса)
возвращает ассоциированный запрашиваемый объект для данного аргумента
(объект точки настройки)

Запросы

Определено в заголовочном файле <execution>
запрашивает у объекта запроса, должен ли он быть перенаправлен через адаптеры с поддержкой запросов
(объект точки настройки)
запрашивает у объекта с поддержкой запросов связанный с ним аллокатор
(объект точки настройки)
запрашивает у объекта с поддержкой запросов связанный с ним токен остановки
(объект точки настройки)
запрашивает у объекта с поддержкой запросов связанную с ним метку домена выполнения
(объект точки настройки)
запрашивает у объекта с поддержкой запросов связанный с ним планировщик
(объект точки настройки)
запрашивает у объекта с поддержкой запросов планировщик, который может быть использован для делегирования работы с целью делегирования прогресса выполнения
(объект точки настройки)
получает планировщик завершения, связанный с меткой завершения из атрибутов отправителя
(объект точки настройки)
запрашивает у планировщика информацию о его execution::forward_progress_guarantee
(объект точки настройки)

Сигнатуры завершения

Определено в заголовке <execution>
Определено в пространстве имён std::execution
тип, кодирующий набор сигнатур завершения
(шаблон класса)
получает сигнатуры завершения отправителя
(объект точки настройки)
преобразует один набор сигнатур завершения в другой
(псевдоним шаблона)
преобразует сигнатуры завершения отправителя
(псевдоним шаблона)
получает тип тега отправителя
(псевдоним шаблона)
получает тип завершения значения отправителя
(псевдоним шаблона)
получает тип завершения ошибки отправителя
(псевдоним шаблона)
определяет, поддерживает ли отправитель завершение остановки
(шаблон переменной)

Утилиты для корутин

Определено в заголовке <execution>
Определено в пространстве имён std::execution
преобразует выражение в awaitable объект внутри конкретной корутины
(объект точки настройки)
при использовании в качестве базового класса типа promise корутины, позволяет senders быть awaitable внутри этого типа корутины
(шаблон класса)

Основные операции

Состояние операции

Определено в заголовочном файле <execution>
Определено в пространстве имён std::execution
соединяет sender с receiver
(объект точки кастомизации)
запускает асинхронную операцию, связанную с объектом operation_state
(объект точки кастомизации)

Функции завершения

Эти функции вызываются отправителями для уведомления получателей о завершении работы.

Определено в заголовке <execution>
Определено в пространстве имён std::execution
функция завершения значения, указывающая на успешное завершение
(объект точки кастомизации)
функция завершения ошибки, указывающая на возникновение ошибки во время вычисления или планирования
(объект точки кастомизации)
функция завершения остановки, указывающая на завершение операции до достижения успеха или неудачи
(объект точки кастомизации)

Алгоритмы отправителя

Фабрики отправителей

Фабрика отправителя — это функция, возвращающая отправитель, параметры которой имеют типы, для которых концепция sender является false .

Ниже приведены фабрики отправителей:

Определено в заголовке <execution>
Определено в пространстве имён std::execution
Принимает переменное число аргументов и возвращает отправитель, который при подключении и запуске завершается синхронно, передавая аргументы в функцию завершения значения получателя
(объект точки кастомизации)
Принимает единственный аргумент и возвращает отправитель, который при подключении и запуске завершается синхронно, передавая аргумент в функцию завершения ошибки получателя
(объект точки кастомизации)
создаёт отправитель, который завершается немедленно, вызывая set_stopped своего получателя
(объект точки кастомизации)
создаёт отправитель, который запрашивает ассоциированное окружение своего получателя
(объект точки кастомизации)
подготавливает граф задач для выполнения на заданном планировщике
(объект точки кастомизации)

Конвейерные адаптеры отправителей

Определено в заголовочном файле <execution>
Определено в пространстве имен std::execution
вспомогательный базовый класс-шаблон для определения конвейерного объекта замыкания адаптера отправителя
(класс-шаблон)

Адаптеры отправителей

Адаптер отправителя — это функция, возвращающая отправитель, параметры которой включают по крайней мере один, чей тип удовлетворяет концепции sender , и для которой возвращаемый отправитель является родительским отправителем для аргументов-отправителей функции-адаптера.

Ниже представлены адаптеры отправителя:

Определено в заголовочном файле <execution>
Определено в пространстве имён std::execution
адаптирует предоставленный отправитель в такой, который будет запускать выполнение на вычислительном ресурсе предоставленного планировщика
(объект точки кастомизации)
адаптирует предоставленный отправитель в такой, который завершается на вычислительном ресурсе предоставленного планировщика
(объект точки кастомизации)
адаптирует предоставленный отправитель для передачи выполнения в ресурс выполнения предоставленного планировщика, на котором работает отправитель или продолжение, а затем возвращает выполнение обратно в исходный ресурс
(объект точки настройки)
планирует выполнение работы, зависящей от завершения предоставленного отправителя, на вычислительных ресурсах предоставленного планировщика
(объект точки кастомизации)
связывает граф задач входного отправителя с узлом, представляющим вызов предоставленной функции со значениями, отправленными входным отправителем в качестве аргументов
(объект точки кастомизации)
связывает граф задач с входным отправителем узлом, представляющим вызов предоставленной функции с ошибкой, отправленной входным отправителем, если произошла ошибка
(объект точки настройки)
связывает граф задач входного отправителя с узлом, представляющим вызов предоставленной функции с поведением остановки входного отправителя, если отправлен сигнал "stopped"
(объект точки кастомизации)
возвращает отправитель, который представляет узел, связанный с входным отправителем, который при запуске вызывает предоставленную функцию со значениями, отправленными входным отправителем, в качестве аргументов
(объект точки кастомизации)
возвращает отправитель, который представляет узел, связанный с входным отправителем, который вызывает предоставленную функцию с ошибкой из входного отправителя, если она произошла
(объект точки кастомизации)
возвращает отправитель, который представляет узел, связанный с входным отправителем, который вызывает предоставленную функцию с токеном остановки из входного отправителя, если отправлен сигнал "stopped"
(объект точки настройки)
создает многократный отправитель, который вызывает функцию с каждым индексом в заданной форме вместе со значениями, отправленными входным отправителем. Отправитель завершается после завершения всех вызовов или при возникновении ошибки
(объект точки настройки)
если предоставленный отправитель является многократным отправителем, возвращает этот отправитель, в противном случае возвращает многократный отправитель, который отправляет значения, эквивалентные значениям, отправленным предоставленным отправителем
(объект точки настройки)
адаптирует несколько входных сендеров в сендер, который завершается после завершения всех входных сендеров
(объект точки кастомизации)
адаптирует несколько входных отправителей, каждый из которых может иметь несколько сигнатур завершения, в отправитель, который завершается после завершения всех входных отправителей
(объект точки кастомизации)
возвращает отправитель, который отправляет вариант кортежей всех возможных наборов типов, отправляемых входным отправителем
(объект точки кастомизации)
возвращает отправитель, который отображает канал значений в std:: optional < std:: decay_t < T >> и канал остановки в std:: nullopt
(объект точки кастомизации)
возвращает отправитель, который отображает остановленный канал в ошибку
(объект точки настройки)

Потребители отправителей

Отправитель-потребитель — это алгоритм, который принимает один или несколько отправителей в качестве параметров и не возвращает отправитель.

Определено в заголовочном файле <execution>
Определено в пространстве имён std::this_thread
блокирует текущий поток до завершения указанного отправителя и возвращает его асинхронный результат
(объект точки кастомизации)
блокирует текущий поток до завершения указанного отправителя с возможными множественными сигнатурами завершения и возвращает его асинхронный результат
(объект точки кастомизации)

Пример

Версия этого примера доступна на 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 , который будет содержать результат
(шаблон функции)