- execution[meta header]
- concept[meta id-type]
- std::execution[meta namespace]
- cpp26[meta cpp]
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 {}; // タグ型
}
- derived_from[link /reference/concepts/derived_from.md]
- sender[link sender.md]
- queryable[link ../queryable.md]
- schedule[link schedule.md]
- get_completion_scheduler[link get_completion_scheduler.md]
- set_value_t[link set_value.md]
- get_env[link get_env.md]
- equality_comparable[link /reference/concepts/equality_comparable.md]
- copyable[link /reference/concepts/copyable.md]
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>);
}
- set_value_t[link set_value.md]
- sender_in[link sender_in.md]
- value_types_of_t[link value_types_of_t.md]
- type_identity_t[link /reference/type_traits/true_type.md]
型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の完了を待機してブロックしてはならない。
#include <execution>
namespace ex = std::execution;
int main()
{
ex::run_loop loop;
ex::scheduler auto sch = loop.get_scheduler();
}
- ex::scheduler[color ff0000]
- ex::run_loop[link run_loop.md.nolink]
- get_scheduler()[link run_loop/get_scheduler.md.nolink]
- C++26
- Clang: ??
- GCC: ??
- ICC: ??
- Visual C++: ??