On 05/19/2016 12:57 PM, Yuxuan Shui wrote:
I find this difficult because I can't passing data via
Fiber.yield/Fiber.call pair. e.g. I want something like:

void fiberFunc() {
    //Add some file descriptor to main loop
    string y = Fiber.yield();
    writeln(y);
}

auto f = new Fiber(&fiberFunc);
f.call();
mainloop {
    if (fd_readable)
       f.call(fd.rawRead());
}

I can probably using a derived fiber class and pass the result via class
members, but that seems clumsy and not very general. Any ideas?


You can use a delegate that takes a ref parameter:

import std.stdio;
import core.thread;

void fiberFunc(ref string y) {
    y = "produced_by_fiberFunc";
    Fiber.yield();
}

void main() {
    string data;
    auto f = new Fiber(() => fiberFunc(data));
    f.call();
    writefln("Writing in main: %s", data);
}

Prints:

Writing in main: produced_by_fiberFunc

Also see std.concurrency.Generator. Both methods appear here:

  http://ddili.org/ders/d.en/fibers.html

Ali

Reply via email to