Boost logo

Boost :

Subject: Re: [boost] [fiber] on schedulers and wakeups
From: Oliver Kowalke (oliver.kowalke_at_[hidden])
Date: 2015-09-09 23:35:26


2015-09-09 0:19 GMT+02:00 Giovanni Piero Deretta <gpderetta_at_[hidden]>:

> context * this_context; // currently running
> scheduler* this_scheduler; // current scheduler
>
> scheduler {
> intrusive_slist<context> ready;
> intrusive_slist<context> ready_next;
> atomic_intrusive_slist<context> remote_ready;
> event_count ec;
> atomic<bool> done; // can be used to interrupt the scheduler
> // this is the idle task, itself a fiber. Should run in the original
> thread stack
> void idle() {
> while (true) {
> auto n = get_next();
> while (n == 0) {
> int ticket = ec.prepare_wait()
> if ((n = get_next()) {
> ec.retire_wait();
> break;
> }
> ec.wait();
> }
> ready_next.push_back(this_context);
> switch_context(n, this_context);

<snip>

the scheduler with its idle() function would introduce extra context
switches because idle() enqueues the scheduler
to the ready_next-queue before it switches to the next fiber.
seams that the scheduler (fiber) is resumed after each (worker)-fiber.
boost.fiber tries to prevent this - it switches only between
(worker)-fibers, the scheduler functions only like a store
for the next fiebrs.


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk