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

履歴 編集

concept
<execution>

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

    namespace std::execution {
      template<class Sch>
      concept scheduler =
        derived_from<typename remove_cvref_t<Sch>::scheduler_concept, scheduler_tag> &&
        queryable<Sch> &&
        requires(Sch&& sch) {
          { schedule(std::forward<Sch>(sch)) } -> sender;
          { get_forward_progress_guarantee(sch) } -> same_as<forward_progress_guarantee>;
        } &&
        equality_comparable<remove_cvref_t<Sch>> &&
        copyable<remove_cvref_t<Sch>>;

      struct scheduler_tag {};  // タグ型
    }

## 概要

`scheduler`は、型`Sch`がScheduler型の要件を満たすことを表すコンセプトである。

下記をみたすクラス型はSchedulerとみなせる。

- `scheduler_tag`をメンバ型`Sch::scheduler_concept`として定義する
- クエリ可能オブジェクトである
- `Sch`型の値`sch`に対して下記を満たすこと
  - `execution::schedule(sch)`がSenderを返す
  - `execution::get_forward_progress_guarantee(sch)`が`forward_progress_guarantee`列挙値を返す
- コピー可能かつ同値比較可能

## モデル

型`Sch`を`scheduler`の型、型`Env`を`sender_in<schedule_result_t<Sch>, Env>`を満たす実行環境の型としたとき、`sender-in-of<schedule_result_t<Sch>, Env>`のモデルとなること。

`copyable<remove_cvref_t<Sch>>`および`equality_comparable<remove_cvref_t<Sch>>`により要求される操作は、例外で終了してはならない。 これらの操作やScheduler型の`schedule`関数は、異なるスレッドから同時に操作を呼び出す可能性がある場合でも、データ競合を引き起こしてはならない。

あるScheduler型`Sch`の2つの値`sch1`と`sch2`に対して、`sch1`と`sch2`が同じ実行リソースを共有する場合に限って、`sch1 == sch2`は`true`となる。

あるScheduler`sch`に対して、式`get_completion_scheduler<set_value_t>(get_env(schedule(sch)))`が適格なとき、`sch`と等しいこと。

あるScheduler`sch`、型`T`、部分式のパック`envs`に対して、下記の式がいずれも不適格となる、もしくはともに適格かつ同じ型を持つこと。

- `get_completion_domain<T>(sch, envs...)`
- `get_completion_domain<T>(get_env(schedule(sch)), envs...)`

同様に、下記の式がいずれも不適格となる、もしくはともに適格かつ同じ型と値を持つこと。

- `get_completion_scheduler<T>(sch, envs...)`
- `get_completion_scheduler<T>(get_env(schedule(sch)), envs...)`

Scheduler型のデストラクタは、`schedule`が返すSenderオブジェクトに接続されたReceiverの完了を待機してブロックしてはならない。

## 説明専用エンティティ

### 式`SCHED-ENV`

説明用のScheduler`sch`に対して、式`SCHED-ENV(sch)`は`queryable`を満たす型の式`o`となり、下記を満たす。

- 式`o.query(get_start_scheduler)`は、型および値が`sch`と等しい右辺値。
- 式`o.query(get_domain)`は`sch.query(get_domain)`と等価。

## 例

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

    int main()
    {
      ex::run_loop loop;
      ex::scheduler auto sch = loop.get_scheduler();
    }

### 出力

## バージョン

### 言語

- C++26

### 処理系

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

## 関連項目

- `execution::schedule`
- `execution::get_completion_scheduler`
- `execution::get_parallel_scheduler`

## 参照

- P2300R10 `std::execution`
- P3396R1 std::execution wording fixes
- LWG4354. Reconsider `weakly_parallel` as the default `forward_progress_guarantee`
- P3826R5 Fix Sender Algorithm Customization
- P3941R4 Scheduler Affinity
- P4154R0 Renaming various execution things