[exec.general] # 33 Execution control library [[exec]](./#exec) ## 33.1 General [exec.general] [1](#1) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L6) This Clause describes components supporting execution of function objects ([[function.objects]](function.objects "22.10 Function objects"))[.](#1.sentence-1) [2](#2) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L10) The following subclauses describe the requirements, concepts, and components for execution control primitives as summarized in Table [157](#tab:exec.summary "Table 157: Execution control library summary")[.](#2.sentence-1) Table [157](#tab:exec.summary) — Execution control library summary [[tab:exec.summary]](./tab:exec.summary) | [🔗](#tab:exec.summary-row-1) | **Subclause** | **Header** | | --- | --- | --- | | [🔗](#tab:exec.summary-row-2)
[[exec.sched]](exec.sched "33.6 Schedulers") | Schedulers | | | [🔗](#tab:exec.summary-row-3)
[[exec.recv]](exec.recv "33.7 Receivers") | Receivers | | | [🔗](#tab:exec.summary-row-4)
[[exec.opstate]](exec.opstate "33.8 Operation states") | Operation states | | | [🔗](#tab:exec.summary-row-5)
[[exec.snd]](exec.snd "33.9 Senders") | Senders | | [3](#3) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L22) Table [158](#tab:exec.pos "Table 158: Types of customization point objects in the execution control library") shows the types of customization point objects ([[customization.point.object]](customization.point.object "16.3.3.3.5 Customization Point Object types")) used in the execution control library[.](#3.sentence-1) Table [158](#tab:exec.pos) — Types of customization point objects in the execution control library [[tab:exec.pos]](./tab:exec.pos) | [🔗](#tab:exec.pos-row-1)
**Customization point** | **Purpose** | **Examples** | | --- | --- | --- | | [🔗](#tab:exec.pos-row-2)
**object type** | | | | [🔗](#tab:exec.pos-row-3)
core | provide core execution functionality, and connection between core components | e.g., [connect](execution.syn#lib:connect "33.4 Header synopsis [execution.syn]"), [start](execution.syn#lib:start "33.4 Header synopsis [execution.syn]") | | [🔗](#tab:exec.pos-row-4)
completion functions | called by senders to announce the completion of the work (success, error, or cancellation) | [set_value](execution.syn#lib:set_value "33.4 Header synopsis [execution.syn]"), [set_error](execution.syn#lib:set_error "33.4 Header synopsis [execution.syn]"), [set_stopped](execution.syn#lib:set_stopped "33.4 Header synopsis [execution.syn]") | | [🔗](#tab:exec.pos-row-5)
senders | allow the specialization of the provided sender algorithms | sender factories (e.g., [schedule](execution.syn#lib:schedule "33.4 Header synopsis [execution.syn]"), [just](execution.syn#lib:just "33.4 Header synopsis [execution.syn]"), [read_env](execution.syn#lib:read_env "33.4 Header synopsis [execution.syn]"))sender adaptors (e.g., [continues_on](execution.syn#lib:continues_on "33.4 Header synopsis [execution.syn]"), [then](execution.syn#lib:then "33.4 Header synopsis [execution.syn]"), [let_value](execution.syn#lib:let_value "33.4 Header synopsis [execution.syn]"))sender consumers (e.g., [sync_wait](execution.syn#lib:sync_wait "33.4 Header synopsis [execution.syn]")) | | [🔗](#tab:exec.pos-row-6)
queries | allow querying different properties of objects | general queries (e.g., [get_allocator](execution.syn#lib:get_allocator "33.4 Header synopsis [execution.syn]"), [get_stop_token](execution.syn#lib:get_stop_token "33.4 Header synopsis [execution.syn]"))environment queries (e.g., get_scheduler, [get_delegation_scheduler](execution.syn#lib:get_delegation_scheduler "33.4 Header synopsis [execution.syn]"))scheduler queries (e.g., [get_forward_progress_guarantee](execution.syn#lib:get_forward_progress_guarantee "33.4 Header synopsis [execution.syn]"))sender attribute queries (e.g., [get_completion_scheduler](execution.syn#lib:get_completion_scheduler "33.4 Header synopsis [execution.syn]")) | [4](#4) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L57) This clause makes use of the following exposition-only entities[.](#4.sentence-1) [5](#5) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L60) For a subexpression expr, let *MANDATE-NOTHROW*(expr) be expression-equivalent to expr[.](#5.sentence-1) *Mandates*: noexcept(expr) is true[.](#5.sentence-2) [6](#6) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L68) namespace std {templateconcept [*movable-value*](#concept:movable-value "33.1 General [exec.general]") = // *exposition only*[move_constructible](concept.moveconstructible#concept:move_constructible "18.4.13 Concept move_­constructible [concept.moveconstructible]")> &&[constructible_from](concept.constructible#concept:constructible_from "18.4.11 Concept constructible_­from [concept.constructible]"), T> &&(!is_array_v>);} [7](#7) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L79) For function types F1 and F2 denotingR1(Args1...) and R2(Args2...), respectively,*MATCHING-SIG*(F1, F2) is true if and only if[same_as](concept.same#concept:same_as "18.4.2 Concept same_­as [concept.same]") is true[.](#7.sentence-1) [8](#8) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L86) For a subexpression err, let Err be decltype((err)) and let *AS-EXCEPT-PTR*(err) be: - [(8.1)](#8.1) err if decay_t denotes the type exception_ptr[.](#8.1.sentence-1) *Preconditions*: !err is false[.](#8.1.sentence-2) - [(8.2)](#8.2) Otherwise,make_exception_ptr(system_error(err)) if decay_t denotes the type error_code[.](#8.2.sentence-1) - [(8.3)](#8.3) Otherwise, make_exception_ptr(err)[.](#8.3.sentence-1) [9](#9) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L104) For a subexpression expr, let *AS-CONST*(expr) be expression-equivalent to[](const auto& x) noexcept -> const auto& { return x; }(expr)