3.1 KiB
[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]
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.
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.
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.
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(); };}