実行制御ライブラリ (C++26から)
From cppreference.com
< cpp
実行制御ライブラリは、汎用的な実行リソース上での非同期実行を管理するためのフレームワークを提供します。
このライブラリは、非同期操作のための語彙型を提供し、単純で合成可能な方法でタスク実行グラフを構築できるようにすることを目的としています。
目次 |
[編集] ライブラリ全体の定義
- Sender: 実行のために送られる非同期な処理の記述。操作状態 (下記) を生成します。
- Senderは、非同期に結果を「Receiver」 (下記) と呼ばれるリスナーに「送信 (send)」します。
- Senderは、汎用的なアルゴリズムを使用してタスクグラフに合成することができます。
- Senderファクトリとアダプタは、senderコンセプトを満たすオブジェクトに、共通の非同期パターンをキャプチャする汎用アルゴリズムです。
- Receiver: Senderによって生成された非同期な結果を消費または「受信 (receive)」する、一般化されたコールバック。
- Receiverには、Senderが結果を伝搬するための3つの異なる「チャネル」があります:成功、失敗、キャンセルで、それぞれ「値 (value)」、「エラー (error)」、「停止 (stopped)」と名付けられています。
- Receiverは拡張可能な実行環境を提供します。これは、コンシューマが非同期操作をパラメータ化するために使用できるキーと値のペアのセットです。
- 操作状態 (Operation State): 非同期操作に必要な状態を保持するオブジェクト。
- SenderとReceiverは、std::execution::connect関数に渡されると接続されます。
- SenderとReceiverを接続した結果が、操作状態です。
- 処理は、操作状態に対して「
start」が呼ばれるまで実行のためにキューに入れられません。 - 一度開始されると、操作状態の生存期間は非同期操作が完了する前に終了することはできず、そのアドレスは安定していなければなりません。
- スケジューラ (Scheduler): 実行コンテキストへの軽量なハンドル。
- 実行コンテキストは、スレッドプールやGPUストリームなどの非同期実行のソースです。
- スケジューラは、実行コンテキストが所有する実行スレッドからReceiverを完了させるSenderのファクトリです。
[編集] ライブラリユーティリティ
[編集] コンセプト
[編集] スケジューラ
| ヘッダ
<execution> で定義 | |
| 名前空間
std::execution で定義 | |
| (C++26) |
型がスケジューラであることを規定する (コンセプト) |
[編集] Sender
| ヘッダ
<execution> で定義 | |
| 名前空間
std::execution で定義 | |
| (C++26) |
型がsenderであることを規定する (コンセプト) |
| (C++26) |
与えられた関連環境型に対して非同期操作を作成できるsenderを規定する (コンセプト) |
| (C++26) |
特定のreceiver型と接続できるsenderを規定する (コンセプト) |
[編集] Receiver
| ヘッダ
<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) |
senderタグからの変換をディスパッチするデフォルトの実行ドメインタグ型 (クラス) |
| (C++26) |
与えられた実行ドメインタグの下で新しいsenderに変換する (関数テンプレート) |
| (C++26) |
与えられた実行ドメインタグの下で新しい問い合わせ可能なオブジェクトに変換する (関数テンプレート) |
| (C++26) |
与えられたsenderコンシューマタグと引数のセットを使用してsenderを消費し、与えられた実行ドメインタグの下でその結果を返す (関数テンプレート) |
[編集] 前方進行保証
| ヘッダ
<execution> で定義 | |
| 名前空間
std::execution で定義 | |
| スケジューラに関連付けられた実行リソースによって作成される実行エージェントの前方進行保証を指定する (列挙型) | |
[編集] 環境
| ヘッダ
<execution> で定義 | |
| 名前空間
std::execution で定義 | |
| (C++26) |
問い合わせオブジェクトと値から問い合わせ可能なオブジェクトを構築する (クラステンプレート) |
| (C++26) |
複数の問い合わせ可能なオブジェクトを1つの問い合わせ可能なオブジェクトに集約する (クラステンプレート) |
| (C++26) |
与えられた引数に関連付けられた問い合わせ可能なオブジェクトを返す (カスタマイゼーションポイントオブジェクト) |
[編集] 問い合わせ
| ヘッダ
<execution> で定義 | |
| (C++26) |
問い合わせオブジェクトに、問い合わせ可能なアダプタを通じて転送されるべきかどうかを尋ねる (カスタマイゼーションポイントオブジェクト) |
| (C++26) |
問い合わせ可能なオブジェクトに関連付けられたアロケータを尋ねる (カスタマイゼーションポイントオブジェクト) |
| (C++26) |
問い合わせ可能なオブジェクトに関連付けられたストップトークンを尋ねる (カスタマイゼーションポイントオブジェクト) |
| (C++26) |
問い合わせ可能なオブジェクトに関連付けられた実行ドメインタグを尋ねる (カスタマイゼーションポイントオブジェクト) |
| (C++26) |
問い合わせ可能なオブジェクトに関連付けられたスケジューラを尋ねる (カスタマイゼーションポイントオブジェクト) |
| 問い合わせ可能なオブジェクトに、前方進行の委譲目的で使用できるスケジューラを尋ねる (カスタマイゼーションポイントオブジェクト) | |
| senderの属性から完了タグに関連付けられた完了スケジューラを取得する (カスタマイゼーションポイントオブジェクト) | |
| スケジューラにそのexecution::forward_progress_guaranteeについて尋ねる (カスタマイゼーションポイントオブジェクト) | |
[編集] 完了シグネチャ
| ヘッダ
<execution> で定義 | |
| 名前空間
std::execution で定義 | |
| 完了シグネチャのセットをエンコードする型 (クラステンプレート) | |
| senderの完了シグネチャを取得する (カスタマイゼーションポイントオブジェクト) | |
| ある完了シグネチャのセットを別のものに変換する (エイリアステンプレート) | |
| senderの完了シグネチャを変換する (エイリアステンプレート) | |
| (C++26) |
senderのタグ型を取得する (エイリアステンプレート) |
| (C++26) |
senderの値完了型を取得する (エイリアステンプレート) |
| (C++26) |
senderのエラー完了型を取得する (エイリアステンプレート) |
| (C++26) |
senderが停止完了をサポートしているかどうかを判定する (変数テンプレート) |
[編集] コルーチンユーティリティ
| ヘッダ
<execution> で定義 | |
| 名前空間
std::execution で定義 | |
| (C++26) |
特定のコルーチン内で式をawait可能なオブジェクトに変換する (カスタマイゼーションポイントオブジェクト) |
| コルーチンのpromise型の基底クラスとして使用された場合、そのコルーチン型内でsenderをawait可能にする (クラステンプレート) | |
[編集] 中核操作
[編集] 操作状態
| ヘッダ
<execution> で定義 | |
| 名前空間
std::execution で定義 | |
| (C++26) |
senderとreceiverを接続する(カスタマイゼーションポイントオブジェクト) |
| (C++26) |
operation_stateオブジェクトに関連付けられた非同期操作を開始する(カスタマイゼーションポイントオブジェクト) |
[編集] 完了関数
これらの関数は、処理の完了をreceiverに通知するためにsenderによって呼び出されます。
| ヘッダ
<execution> で定義 | |
| 名前空間
std::execution で定義 | |
| (C++26) |
成功裡の完了を示す値完了関数 (カスタマイゼーションポイントオブジェクト) |
| (C++26) |
計算中またはスケジューリング中にエラーが発生したことを示すエラー完了関数 (カスタマイゼーションポイントオブジェクト) |
| (C++26) |
操作が成功または失敗に到達する前に終了したことを示す停止完了関数 (カスタマイゼーションポイントオブジェクト) |
[編集] Senderアルゴリズム
| このセクションは未完成です 理由: 現行標準への更新作業が進行中 |
[編集] Senderファクトリ
Senderファクトリとは、senderを返し、そのパラメータの型がsenderコンセプトに対してfalseである関数です。
以下はSenderファクトリです
| ヘッダ
<execution> で定義 | |
| 名前空間
std::execution で定義 | |
| (C++26) |
可変個の引数を受け取り、接続および開始されると、引数をreceiverの値完了関数に渡すことで同期的に完了するsenderを返す (カスタマイゼーションポイントオブジェクト) |
| (C++26) |
単一の引数を受け取り、接続および開始されると、引数をreceiverのエラー完了関数に渡すことで同期的に完了するsenderを返す (カスタマイゼーションポイントオブジェクト) |
| (C++26) |
receiverのset_stoppedを呼び出すことで即座に完了するsenderを作成する(カスタマイゼーションポイントオブジェクト) |
| (C++26) |
receiverに関連付けられた環境を問い合わせるsenderを作成する (カスタマイゼーションポイントオブジェクト) |
| (C++26) |
与えられたスケジューラ上での実行のためにタスクグラフを準備する (カスタマイゼーションポイントオブジェクト) |
[編集] パイプ可能なSenderアダプタ
| ヘッダ
<execution> で定義 | |
| 名前空間
std::execution で定義 | |
| パイプ可能なsenderアダプタクロージャオブジェクトを定義するためのヘルパー基底クラステンプレート (クラステンプレート) | |
[編集] Senderアダプタ
Senderアダプタとは、senderコンセプトを満たす型を少なくとも1つパラメータに含み、返されるsenderがアダプタ関数のsender引数の親senderであるようなsenderを返す関数です。
以下はSenderアダプタです
| ヘッダ
<execution> で定義 | |
| 名前空間
std::execution で定義 | |
| (C++26) |
提供されたsenderを、提供されたスケジューラの実行リソース上で実行を開始するものに適合させる (カスタマイゼーションポイントオブジェクト) |
| (C++26) |
提供されたsenderを、提供されたスケジューラの実行リソース上で完了するものに適合させる (カスタマイゼーションポイントオブジェクト) |
| (C++26) |
提供されたsenderを、senderまたは継続が実行される提供されたスケジューラの実行リソースに実行を移し、その後元のリソースに実行を戻すように適合させる (カスタマイゼーションポイントオブジェクト) |
| (C++26) |
提供されたsenderの完了に依存する処理を、提供されたスケジューラの実行リソース上にスケジュールする (カスタマイゼーションポイントオブジェクト) |
| (C++26) |
入力senderによるタスクグラフを、入力senderから送られた値を引数として提供された関数を呼び出すノードで連結する (カスタマイゼーションポイントオブジェクト) |
| (C++26) |
エラーが発生した場合、入力senderによるタスクグラフを、入力senderから送られたエラーを引数として提供された関数を呼び出すノードで連結する (カスタマイゼーションポイントオブジェクト) |
| (C++26) |
「停止」シグナルが送られた場合、入力senderによるタスクグラフを、入力senderからの停止動作を引数として提供された関数を呼び出すノードで連結する (カスタマイゼーションポイントオブジェクト) |
| (C++26) |
入力senderに連結されたノードを表すsenderを返す。開始されると、入力senderから送られた値を引数として提供された関数を呼び出す (カスタマイゼーションポイントオブジェクト) |
| (C++26) |
入力senderに連結されたノードを表すsenderを返す。エラーが発生した場合、入力senderからのエラーを引数として提供された関数を呼び出す (カスタマイゼーションポイントオブジェクト) |
| (C++26) |
入力senderに連結されたノードを表すsenderを返す。「停止」シグナルが送られた場合、入力senderからのストップトークンを引数として提供された関数を呼び出す (カスタマイゼーションポイントオブジェクト) |
| 提供された形状のすべてのインデックスと入力senderから送られた値を引数として関数を呼び出すマルチショットsenderを作成する。すべての呼び出しが完了するか、エラーが発生すると、senderは完了する (カスタマイゼーションポイントオブジェクト) | |
| (C++26) |
提供されたsenderがマルチショットsenderであればそのsenderを返し、そうでなければ、提供されたsenderが送る値と同等の値を送るマルチショットsenderを返す (カスタマイゼーションポイントオブジェクト) |
| (C++26) |
複数の入力senderを、すべての入力senderが完了した時点で完了するsenderに適合させる (カスタマイゼーションポイントオブジェクト) |
| それぞれが複数の完了シグネチャを持つ可能性のある複数の入力senderを、すべての入力senderが完了した時点で完了するsenderに適合させる (カスタマイゼーションポイントオブジェクト) | |
| (C++26) |
入力senderによって送られる可能性のあるすべての型のセットのタプルのvariantを送るsenderを返す (カスタマイゼーションポイントオブジェクト) |
| 値チャネルをstd::optional<std::decay_t<T>>に、停止チャネルをstd::nulloptにマッピングするsenderを返す (カスタマイゼーションポイントオブジェクト) | |
| (C++26) |
停止チャネルをエラーにマッピングするsenderを返す (カスタマイゼーションポイントオブジェクト) |
[編集] Senderコンシューマ
Senderコンシューマは、1つ以上のsenderをパラメータとして受け取り、senderを返さないアルゴリズムです。
| ヘッダ
<execution> で定義 | |
| 名前空間
std::this_threadで定義 | |
| (C++26) |
指定されたsenderが完了するまで現在のスレッドをブロックし、その非同期結果を返す (カスタマイゼーションポイントオブジェクト) |
| 複数の完了シグネチャを持つ可能性のある指定されたsenderが完了するまで現在のスレッドをブロックし、その非同期結果を返す (カスタマイゼーションポイントオブジェクト) | |
[編集] 例
この例のバージョンはgodbolt.orgで利用可能です。そこではstd::executionの実験的なリファレンス実装であるstdexecを使用しています。
このコードを実行
#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を返す (関数テンプレート) |