Files
cppdraft_translate/cppdraft/exec/run/loop/general.md
2025-10-25 03:02:53 +03:00

3.1 KiB
Raw Blame History

[exec.run.loop.general]

33 Execution control library [exec]

33.12 Execution contexts [exec.ctx]

33.12.1 execution::run_loop [exec.run.loop]

33.12.1.1 General [exec.run.loop.general]

1

#

A run_loop is an execution resource on which work can be scheduled.

It maintains a thread-safe first-in-first-out queue of work.

Its run member function removes elements from the queue and executes them in a loop on the thread of execution that calls run.

2

#

A run_loop instance has an associated count that corresponds to the number of work items that are in its queue.

Additionally, a run_loop instance has an associated state that can be one ofstarting, running, finishing, or finished.

3

#

Concurrent invocations of the member functions of run_loop other than run and its destructor do not introduce data races.

The member functionspop-front, push-back, and finish execute atomically.

4

#

Recommended practice: Implementations should use an intrusive queue of operation states to hold the work units to make scheduling allocation-free.

namespace std::execution {class run_loop {// [exec.run.loop.types], associated typesclass run-loop-scheduler; // exposition onlyclass run-loop-sender; // exposition onlystruct run-loop-opstate-base { // exposition onlyvirtual void execute() = 0; // exposition only run_loop* loop; // exposition onlyrun-loop-opstate-base next; // exposition only}; templateusing run-loop-opstate = unspecified; // exposition only// [exec.run.loop.members], member functionsrun-loop-opstate-base** pop-front(); // exposition onlyvoid push-back(run-loop-opstate-base*); // exposition onlypublic:// [exec.run.loop.ctor], constructor and destructor run_loop() noexcept; run_loop(run_loop&&) = delete; ~run_loop(); // [exec.run.loop.members], member functionsrun-loop-scheduler get_scheduler(); void run(); void finish(); };}