33 Execution control library [exec]

33.12 Execution contexts [exec.ctx]

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

33.12.1.4 Member functions [exec.run.loop.members]

run-loop-opstate-base* pop-front();
Effects: Blocks ([defns.block]) until one of the following conditions is true:
  • The run_loop instance's count is 0 and its state is finishing, in which case pop-front sets the state to finished and returns nullptr; or
  • the run_loop instance's count is greater than 0, in which case an item is removed from the front of the queue, the count is decremented by 1, and the removed item is returned.
void push-back(run-loop-opstate-base* item);
Effects: Adds item to the back of the queue and increments the run_loop instance's count by 1..
Synchronization: This operation synchronizes with the pop-front operation that obtains item.
run-loop-scheduler get_scheduler();
Returns: An instance of run-loop-scheduler that can be used to schedule work onto this run_loop instance.
void run();
Preconditions: The run_loop instance's state is either starting or finishing.
Effects: If the run_loop instance's state is starting, sets the state to running, otherwise leaves the state unchanged.
Then, equivalent to: while (auto* op = pop-front()) { op->execute(); }
Remarks: When the run_loop instance's state changes, it does so without introducing data races.
void finish();
Preconditions: The run_loop instance's state is either starting or running.
Effects: Changes the run_loop instance's state to finishing.
Synchronization: finish synchronizes with the pop-front operation that returns nullptr.