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