...ing logging 4.0

はてなブログに移行しました。D言語の話とかいろいろ。

core.thread.Fiber

threadは知ってたけどfiberは名前しか知らなかったので勉強.
fiberは,threadよりも切り替えが高速で,コンテキストスイッチングをユーザが明示的に行うものらしい(参考).
何が便利なのかはhttp://ufcpp.net/study/csharp/sp2_microthread.htmlがわかりやすかった.
ていうか普通にC#のyieldだな.
これを参考にサンプルを書いてみた.

// dmd 2.020
import std.stdio;
import core.thread;
void func() {
    writefln("start");
    for(int i=0; i<10; ++i){
        writef("a");
        Fiber.yield();
    }
    writef("\nend");
}
void main() {
    auto f = new Fiber(&func);
    while(f.state != Fiber.State.TERM)
        f.call();
}

f.call()を呼び出すと,func()の最初のターンが始まる.
まず,startを表示した後,forループに入ってaを表示して,Fiber.yield()で中断して呼び出し元にコンテキストが戻る.
次のターンでは,中断したところから実行するので,forループの中でaを表示して(ry
結局f.call()を実行する度にfunc()内のforループをぐるぐる回って,全部で10個のaを表示する.
最後のf.call()で,func()がendを表示する.
fiber fを最後まで実行したので,whileループの条件f.state != Fiber.State.TERMが偽になって,プログラム終了.
なるほど.