最終更新日時: 2026年06月08日 10時13分52秒 (JST)
yoh が更新

履歴 編集

class
<execution>

# std::execution::run_loop(C++26)

    namespace std::execution {
      class run_loop;
    }

## 概要

`run_loop`は、実行制御ライブラリの作業をスケジュール可能な実行リソース(execution resource)である。

内部的にスレッドセーフなFIFO (first-in first-out) 作業キューを保持する。 `run`メンバ関数はキューから作業を順次取り出し、同関数を呼び出すスレッド上で逐次実行する。

`run_loop`インスタンスの動作説明のため、下記の説明用メンバ変数を持つ。

- `count` : キュー上に保持している作業の個数
- `state` : 開始(starting)／実行中(running)／終了中(finishing)／終了済み(finished) いずれかの状態

## メンバ関数

名前 | 説明 | 対応バージョン
--- | --- | ---
`(constructor)` | コンストラクタ | C++26
`(destructor)` | デストラクタ | C++26
`get_scheduler` | Scheduler取得 | C++26
`run` | キュー上の作業を逐次実行 | C++26
`finish` | 状態を終了中に変更 | C++26

## メンバ型

名前 | 説明 | 対応バージョン
--- | --- | ---
`run-loop-scheduler` | 動作説明用のScheduler型 | C++26
`run-loop-sender` | 動作説明用のSender型 | C++26
`run-loop-opstate-base` | 動作説明用の基底クラス | C++26
`run-loop-opstate` | 動作説明用のクラステンプレート | C++26

## 例

    #include <print>
    #include <execution>
    namespace ex = std::execution;

    struct MyReceiver {
      using receiver_concept = ex::receiver_tag;

      void set_value() noexcept
        { std::println("success"); }
      void set_error(std::exception_ptr) noexcept
        { std::println("failure"); }
      void set_stopped() noexcept
        { std::println("cancellation"); }
    };

    int main()
    {
      ex::run_loop loop;
      // count=0, state=開始(starting)

      // run_loopのスケジュールSenderとReceiverを接続
      ex::scheduler auto sch = loop.get_scheduler();
      ex::sender auto sndr = ex::schedule(sch);
      ex::receiver auto rcvr = MyReceiver{};
      auto op = ex::connect(sndr, rcvr);

      // run_loopキューに作業を1つ追加
      ex::start(op);
      // count=1, state=開始(starting)

      // run_loop状態を終了中(finishing)へ変更
      loop.finish();
      // count=1, state=終了中(finishing)

      // run_loopキュー上の作業を逐次実行
      loop.run();
      // count=0, state=終了済み(finished)
    }

### 出力

    success

## バージョン

### 言語

- C++26

### 処理系

- Clang: ??
- GCC: ??
- ICC: ??
- Visual C++: ??

## 関連項目

- `execution::scheduler`

## 参照

- P2300R10 `std::execution`
- P3396R1 std::execution wording fixes
- LWG4476. `run_loop` should not have a `set_error` completion