namespace std::execution {
template<class Sch>
concept scheduler =
derived_from<typename remove_cvref_t<Sch>::scheduler_concept, scheduler_t> &&
queryable<Sch> &&
requires(Sch&& sch) {
{ schedule(std::forward<Sch>(sch)) } -> sender;
{ auto(get_completion_scheduler<set_value_t>(
get_env(schedule(std::forward<Sch>(sch))))) }
-> same_as<remove_cvref_t<Sch>>;
} &&
equality_comparable<remove_cvref_t<Sch>> &&
copyable<remove_cvref_t<Sch>>;
struct scheduler_t {}; // タグ型
}
概要
schedulerは、型SchがScheduler型の要件を満たすことを表すコンセプトである。
下記をみたすクラス型はSchedulerとみなせる。
scheduler_tをメンバ型Sch::scheduler_conceptとして定義する- クエリ可能オブジェクトである
Sch型の値schに対して下記を満たすことexecution::schedule(sch)がSenderを返す- 上記Senderの値完了関数の完了Schedulerが
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に対して式get_domain(sch)が適格であるとき、式get_domain(get_env(schedule(sch)))も適格であり、かつ同じ型を持つ。
Scheduler型のデストラクタは、scheduleが返すSenderオブジェクトに接続されたReceiverの完了を待機してブロックしてはならない。
説明専用エンティティ
式SCHED-ATTRS
説明用のSchedulerschに対して、式SCHED-ATTRS(sch)はqueryableを満たす型の式o1となり、下記を満たす。
- 型
Tagがset_value_tもしくはset_stopped_tのとき、式o1.query(get_completion_scheduler<Tag>)の型および値がschと等しい。 - 式
o1.query(get_domain)はsch.query(get_domain)と等価。
式SCHED-ENV
説明用のSchedulerschに対して、式SCHED-ENV(sch)はqueryableを満たす型の式o2となり、下記を満たす。
- 式
o2.query(get_scheduler)は、型および値がschと等しい右辺値。 - 式
o2.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++: ??