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
に等しいこと
- コピー可能かつ同値比較可能
モデル
説明専用のエイリアステンプレートvalue-signature
, コンセプトsender-in-of
を下記の通り定義する。
namespace std::execution {
template<class... As>
using value-signature = set_value_t(As...);
template<class Sndr, class Env, class... Values>
concept sender-in-of =
sender_in<Sndr, Env> &&
MATCHING-SIG(
set_value_t(Values...),
value_types_of_t<Sndr, Env, value-signature, type_identity_t>);
}
型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++: ??