Namespaces
Variants

Execution control library (since C++26)

From cppreference.net

実行制御ライブラリは、汎用的な実行リソース上での非同期実行を管理するためのフレームワークを提供します。

このライブラリは、非同期操作のための語彙型を提供し、タスク実行グラフをシンプルで合成可能な方法で構築することを目的としています。

目次

ライブラリ全体の定義

  • Sender : 非同期処理の実行のために送信される作業の記述。操作状態(下記)を生成する。
  • 送信者は非同期にその結果を「レシーバー」(下記)と呼ばれるリスナーに「送信」します。
  • 送信者はジェネリックアルゴリズムを使用して タスクグラフ に構成できます。
  • 送信者ファクトリーとアダプター は、 sender コンセプトを満たすオブジェクト内で一般的な非同期パターンを捕捉するジェネリックアルゴリズムです。
  • Receiver : 非同期操作によって生成された結果を消費または「受信」する汎用コールバック。
  • レシーバーは、送信者が結果を伝播するための3つの異なる「チャネル」を持っています:成功、失敗、キャンセル。これらはそれぞれ「値」、「エラー」、「停止」と呼ばれます。
  • レシーバーは拡張可能な実行環境を提供します:消費者が非同期操作をパラメータ化するために使用できるキーと値のペアのセットです。
  • 操作状態 : 非同期操作で必要とされる状態を含むオブジェクト。
  • 送信者とレシーバーは、 std::execution::connect 関数に渡されたときに接続されます。
  • 送信者とレシーバーを接続した結果は、オペレーション状態です。
  • オペレーション状態に対して「 start 」が呼び出されるまで、実行のためのワークはエンキューされません。
  • 一度開始されると、非同期オペレーションが完了する前にオペレーション状態の寿命が終了することはなく、そのアドレスは安定している必要があります。
  • Scheduler : 実行コンテキストへの軽量なハンドル。
  • 実行コンテキストは、スレッドプールやGPUストリームなどの非同期実行のソースです。
  • スケジューラは、実行コンテキストが所有する実行スレッドからそのレシーバーを完了させる送信者のファクトリです。

ライブラリユーティリティ

コンセプト

スケジューラ

ヘッダーで定義 <execution>
名前空間で定義 std::execution
型がスケジューラであることを指定
(コンセプト)

送信者

ヘッダーで定義 <execution>
名前空間で定義 std::execution
型がsenderであることを指定する
(コンセプト)
指定された関連環境型に対して非同期操作を作成できるsenderを指定する
(コンセプト)
特定のreceiver型と接続できるsenderを指定する
(コンセプト)

レシーバー

ヘッダーで定義 <execution>
名前空間で定義 std::execution
型がreceiverであることを指定する
(コンセプト)
型が指定された完了シグネチャに対するreceiverであることを指定する
(コンセプト)

操作状態

ヘッダーで定義 <execution>
名前空間で定義 std::execution
型が操作状態であることを指定する
(コンセプト)

ユーティリティコンポーネント

実行コンテキスト

ヘッダーで定義 <execution>
名前空間で定義 std::execution
スレッドセーフな MPSC タスクキューと手動駆動のイベントループを保持する実行リソース
(クラス)

実行ドメイン

ヘッダで定義 <execution>
名前空間で定義 std::execution
送信者タグからの変換をディスパッチするデフォルト実行ドメインタグ型
(クラス)
指定された実行ドメインタグの下で新しい送信者に変換する
(関数テンプレート)
指定された実行ドメインタグの下で新しいクエリ可能オブジェクトに変換する
(関数テンプレート)
指定された送信者コンシューマタグと引数のセットを使用して送信者を消費し、指定された実行ドメインタグの下でその結果を返す
(関数テンプレート)

前方進行保証

ヘッダーで定義 <execution>
名前空間で定義 std::execution
スケジューラーの関連する実行リソースによって作成される実行エージェントの 前方進行保証 を指定する
(列挙型)

環境

ヘッダーで定義 <execution>
名前空間で定義 std::execution
クエリ可能オブジェクトをクエリオブジェクトと値から構築する
(クラステンプレート)
複数のクエリ可能オブジェクトを1つのクエリ可能オブジェクトに集約する
(クラステンプレート)
指定された引数に対応するクエリ可能オブジェクトを返す
(カスタマイゼーションポイントオブジェクト)

クエリ

定義済みヘッダ <execution>
クエリオブジェクトがクエリ可能アダプタを通じて転送されるべきかどうかを問い合わせる
(カスタマイゼーションポイントオブジェクト)
クエリ可能オブジェクトに関連付けられたアロケータを問い合わせる
(カスタマイゼーションポイントオブジェクト)
クエリ可能オブジェクトに関連付けられたストップトークンを問い合わせる
(カスタマイゼーションポイントオブジェクト)
クエリ可能オブジェクトに関連付けられた実行ドメインタグを問い合わせる
(カスタマイゼーションポイントオブジェクト)
クエリ可能オブジェクトに関連付けられたスケジューラを問い合わせる
(カスタマイゼーションポイントオブジェクト)
前方進行委任の目的で作業を委任するために使用できるスケジューラをクエリ可能オブジェクトに問い合わせる
(カスタマイゼーションポイントオブジェクト)
送信者の属性から完了タグに関連付けられた完了スケジューラを取得する
(カスタマイゼーションポイントオブジェクト)
スケジューラにその execution::forward_progress_guarantee について問い合わせる
(カスタマイゼーションポイントオブジェクト)

完了シグネチャ

ヘッダで定義 <execution>
名前空間で定義 std::execution
完了シグネチャのセットをエンコードする型
(クラステンプレート)
送信者の完了シグネチャを取得する
(カスタマイゼーションポイントオブジェクト)
完了シグネチャのセットを別のセットに変換する
(エイリアステンプレート)
送信者の完了シグネチャを変換する
(エイリアステンプレート)
送信者のタグ型を取得する
(エイリアステンプレート)
送信者の値完了型を取得する
(エイリアステンプレート)
送信者のエラー完了型を取得する
(エイリアステンプレート)
送信者が停止完了をサポートするかどうかを判定する
(変数テンプレート)

コルーチン ユーティリティ

ヘッダーで定義 <execution>
名前空間で定義 std::execution
特定のコルーチン内で式をawaitableオブジェクトに変換する
(カスタマイゼーションポイントオブジェクト)
コルーチンプロミス型の基底クラスとして使用した場合、そのコルーチン型内でsendersをawaitableにできるようにする
(クラステンプレート)

コア操作

動作状態

ヘッダーで定義 <execution>
名前空間で定義 std::execution
sender receiver を接続する
(カスタマイゼーションポイントオブジェクト)
operation_state オブジェクトに関連付けられた非同期操作を開始する
(カスタマイゼーションポイントオブジェクト)

完了関数

これらの関数は、送信側が受信側に対して作業の完了を通知するために呼び出されます。

ヘッダーで定義 <execution>
名前空間で定義 std::execution
正常完了を示す値完了関数
(カスタマイゼーションポイントオブジェクト)
計算またはスケジューリング中にエラーが発生したことを示すエラー完了関数
(カスタマイゼーションポイントオブジェクト)
成功または失敗を達成する前に操作が終了したことを示す停止完了関数
(カスタマイゼーションポイントオブジェクト)

送信側アルゴリズム

Senderファクトリ

送信者ファクトリは送信者を返す関数であり、そのパラメータの型に対して sender コンセプトが false となるものです。

以下は送信者ファクトリです:

定義ヘッダー <execution>
名前空間で定義 std::execution
可変個の引数を受け取り、接続して開始されたときに、引数をレシーバーの値完了関数に渡すことで同期的に完了するsenderを返す
(カスタマイゼーションポイントオブジェクト)
単一の引数を受け取り、接続して開始されたときに、引数をレシーバーのエラー完了関数に渡すことで同期的に完了するsenderを返す
(カスタマイゼーションポイントオブジェクト)
レシーバーの set_stopped を呼び出すことで即座に完了するsenderを作成する
(カスタマイゼーションポイントオブジェクト)
レシーバーの関連付けられた環境を問い合わせるsenderを作成する
(カスタマイゼーションポイントオブジェクト)
指定されたスケジューラ上で実行するためのタスクグラフを準備する
(カスタマイゼーションポイントオブジェクト)

パイプ可能なセンダーアダプタ

ヘッダーで定義 <execution>
名前空間で定義 std::execution
パイプ可能なsender adaptor closureオブジェクトを定義するためのヘルパーベースクラステンプレート
(クラステンプレート)

送信者アダプタ

送信者アダプタは、少なくとも1つのパラメータの型が sender コンセプトを満たす送信者を返す関数であり、返される送信者はアダプタ関数の送信者引数の親送信者となります。

以下は送信側アダプタです:

ヘッダーで定義 <execution>
名前空間 std::execution で定義
提供されたスケジューラの実行リソース上で実行を開始するように、提供されたsenderを適応させる
(カスタマイゼーションポイントオブジェクト)
提供されたスケジューラの実行リソース上で完了するように、提供されたsenderを適応させる
(カスタマイゼーションポイントオブジェクト)
提供されたsenderを適応させ、提供されたschedulerの実行リソース上でsenderまたは継続が実行されるようにし、その後元のリソースに実行を戻す
(カスタマイゼーションポイントオブジェクト)
提供されたsenderの完了に依存する作業を、提供されたschedulerの実行リソース上にスケジュールする
(カスタマイゼーションポイントオブジェクト)
入力senderから送信された値を引数として提供された関数を呼び出すノードで、入力senderによるタスクグラフを連鎖させる
(カスタマイゼーションポイントオブジェクト)
入力senderからエラーが送信された場合、そのエラーと提供された関数を呼び出すノードでタスクグラフを連鎖させる
(カスタマイゼーションポイントオブジェクト)
入力senderの停止動作によって「停止」信号が送信された場合、提供された関数を呼び出すノードで入力senderによってタスクグラフを連鎖させる
(カスタマイゼーションポイントオブジェクト)
入力senderから送信された値を引数として、提供された関数を呼び出すノードを入力senderに連結したsenderを返す
(カスタマイゼーションポイントオブジェクト)
入力senderからのエラーが発生した場合、そのエラーを指定された関数で処理するノードを入力senderに連結したsenderを返す
(カスタマイゼーションポイントオブジェクト)
入力senderから"stopped"シグナルが送信された場合、入力senderのstop tokenを使用して提供された関数を呼び出す、入力senderにチェーンされたノードを表すsenderを返す
(カスタマイゼーションポイントオブジェクト)
入力 sender から送信された値とともに、指定された形状内のすべてのインデックスに対して関数を呼び出すマルチショット sender を作成します。sender はすべての呼び出しが完了したか、エラーが発生した時点で完了します
(カスタマイゼーションポイントオブジェクト)
提供されたsenderがmulti-shot senderの場合、そのsenderを返し、そうでない場合、提供されたsenderが送信する値と同等の値を送信するmulti-shot senderを返す
(カスタマイゼーションポイントオブジェクト)
複数の入力senderを、すべての入力senderが完了した時点で完了するsenderに適応する
(カスタマイゼーションポイントオブジェクト)
複数の入力senderを適応し、それぞれが複数の完了シグネチャを持つ可能性がある場合に、すべての入力senderが完了した時点で完了するsenderに変換する
(カスタマイゼーションポイントオブジェクト)
入力senderによって送信されるすべての可能な型セットのタプルのvariantを送信するsenderを返す
(カスタマイゼーションポイントオブジェクト)
値チャネルを std:: optional < std:: decay_t < T >> にマッピングし、停止チャネルを std:: nullopt にマッピングするsenderを返す
(カスタマイゼーションポイントオブジェクト)
停止チャネルをエラーにマッピングするsenderを返す
(カスタマイゼーションポイントオブジェクト)

送信者コンシューマ

送信者コンシューマは、1つ以上の送信者をパラメータとして受け取り、送信者を返さないアルゴリズムです。

ヘッダーで定義 <execution>
名前空間で定義 std::this_thread
指定されたsenderが完了し、その非同期結果を返すまで現在のスレッドをブロックする
(カスタマイゼーションポイントオブジェクト)
複数の完了シグネチャを持つ可能性のある指定されたsenderが完了し、その非同期結果を返すまで現在のスレッドをブロックする
(カスタマイゼーションポイントオブジェクト)

この例のバージョンは 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 を返す
(関数テンプレート)