Where can i find examples of multi-threaded fibers?

Ali Çehreli via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sun Jul 26 12:51:07 PDT 2015


On 07/26/2015 11:07 AM, Gary Willoughby wrote:> In the description for 
Fiber in std.thread is the following[1]:
 >
 > "Please note that there is no requirement that a fiber be bound to one
 > specific thread. Rather, fibers may be freely passed between threads so
 > long as they are not currently executing."
 >
 > How would this be accomplished and are there any code examples available
 > to learn from? I'm assuming this would require a custom scheduler
 > similar to the one in std.concurrency?[2]
 >
 > [1]: http://dlang.org/phobos/core_thread.html#.Fiber
 > [2]: http://dlang.org/phobos/std_concurrency.html#.FiberScheduler

It should be as simple as sending the fiber object between threads 
(including casting to-and-from shared when needed).

I used std.concurrency.Generator[1][2] below instead of a naked Fiber as 
it is much more cleaner.

main() uses the fiber then passes it to its worker and continues using 
it again:

import std.stdio;
import std.range;
import std.algorithm;
import std.concurrency;
import core.thread;

void fiberFunction()
{
     10.iota.each!(i => yield(i));
}

void threadFunction()
{
     auto fiber = cast()receiveOnly!(shared(Generator!int));
     writefln("Produced in worker: %(%s %)", fiber.take(5));
}

void main()
{
     auto numbers = new Generator!int(&fiberFunction);
     auto worker = spawn(&threadFunction);

     writefln("Produced in main  : %(%s %)", numbers.take(2));
     worker.send(cast(shared)numbers);
     thread_joinAll();

     writefln("Produced in main  : %(%s %)", numbers);
}

Here is the output:

Produced in main  : 0 1
Produced in worker: 2 3 4 5 6
Produced in main  : 7 8 9

Ali

[1] http://dlang.org/phobos/std_concurrency.html#.Generator
[2] 
http://ddili.org/ders/d.en/fibers.html#ix_fibers.Generator,%20std.concurrency



More information about the Digitalmars-d-learn mailing list