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に対して下記を満たすこと- コピー可能かつ同値比較可能
モデル
型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となる。
あるSchedulerschに対して、式get_completion_scheduler<set_value_t>(get_env(schedule(sch)))が適格なとき、schと等しいこと。
あるSchedulersch、型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
説明用のSchedulerschに対して、式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++: ??