[exec.sched] # 33 Execution control library [[exec]](./#exec) ## 33.6 Schedulers [exec.sched] [1](#1) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L1099) The [scheduler](#concept:scheduler "33.6 Schedulers [exec.sched]") concept defines the requirements of a scheduler type ([[exec.async.ops]](exec.async.ops "33.3 Asynchronous operations"))[.](#1.sentence-1) schedule is a customization point object that accepts a scheduler[.](#1.sentence-2) A valid invocation of schedule is a schedule-expression[.](#1.sentence-3) namespace std::execution {templateconcept [scheduler](#concept:scheduler "33.6 Schedulers [exec.sched]") =[derived_from](concept.derived#concept:derived_from "18.4.3 Concept derived_­from [concept.derived]")::scheduler_concept, scheduler_t> &&[*queryable*](exec.queryable.concept#concept:queryable "33.2.2 queryable concept [exec.queryable.concept]") &&requires(Sch&& sch) {{ schedule(std::forward(sch)) } -> [sender](exec.snd.concepts#concept:sender "33.9.3 Sender concepts [exec.snd.concepts]"); { auto(get_completion_scheduler( get_env(schedule(std::forward(sch))))) }-> [same_as](concept.same#concept:same_as "18.4.2 Concept same_­as [concept.same]")>; } &&[equality_comparable](concept.equalitycomparable#concept:equality_comparable "18.5.4 Concept equality_­comparable [concept.equalitycomparable]")> &&[copyable](concepts.object#concept:copyable "18.6 Object concepts [concepts.object]")>;} [2](#2) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L1122) Let Sch be the type of a scheduler and let Env be the type of an execution environment for which [sender_in](exec.snd.concepts#concept:sender_in "33.9.3 Sender concepts [exec.snd.concepts]"), Env> is satisfied[.](#2.sentence-1) Then [*sender-in-of*](exec.snd.concepts#concept:sender-in-of "33.9.3 Sender concepts [exec.snd.concepts]"), Env> shall be modeled[.](#2.sentence-2) [3](#3) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L1130) No operation required by[copyable](concepts.object#concept:copyable "18.6 Object concepts [concepts.object]")> and[equality_comparable](concept.equalitycomparable#concept:equality_comparable "18.5.4 Concept equality_­comparable [concept.equalitycomparable]")> shall exit via an exception[.](#3.sentence-1) None of these operations, nor a scheduler type's schedule function, shall introduce data races as a result of potentially concurrent ([[intro.races]](intro.races "6.10.2.2 Data races")) invocations of those operations from different threads[.](#3.sentence-2) [4](#4) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L1141) For any two values sch1 and sch2 of some scheduler type Sch,sch1 == sch2 shall return true only if both sch1 and sch2 share the same associated execution resource[.](#4.sentence-1) [5](#5) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L1148) For a given scheduler expression sch, the expressionget_completion_scheduler(get_env(schedule(sch))) shall compare equal to sch[.](#5.sentence-1) [6](#6) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L1154) For a given scheduler expression sch, if the expression get_domain(sch) is well-formed, then the expression get_domain(get_env(schedule(sch))) is also well-formed and has the same type[.](#6.sentence-1) [7](#7) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L1160) A scheduler type's destructor shall not block pending completion of any receivers connected to the sender objects returned from schedule[.](#7.sentence-1) [*Note [1](#note-1)*: The ability to wait for completion of submitted function objects can be provided by the associated execution resource of the scheduler[.](#7.sentence-2) — *end note*]