Skip to content

Latest commit

 

History

History
120 lines (94 loc) · 4.56 KB

scheduler.md

File metadata and controls

120 lines (94 loc) · 4.56 KB

scheduler

  • 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とみなせる。

モデル

説明専用のエイリアステンプレート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]

Schschedulerの型、型Envsender_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つの値sch1sch2に対して、sch1sch2が同じ実行リソースを共有する場合に限って、sch1 == sch2trueとなる。

ある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

処理系

関連項目

参照