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が偽になって,プログラム終了.
なるほど.