ファイバーは協調的なやりかたで並行性を実装する方法です。Fiber
クラスはモジュール
core.thread
に定義されています。
ファイバーにやることがないとき、または入力を待っているときに、Fiber.yield()
を呼び出すことで命令を実行する機会を積極的に放棄するというのが基本理念です。
親コンテキストがコントロールを得ますがファイバーの状態 -
スタック上のすべての変数 - は保持されます。ファイバーは再開することができ、
Fiber.yield()
が呼ばれた直後からの命令を継続します。魔法でしょうか?そのとおり。
void foo() {
writeln("Hello");
Fiber.yield();
writeln("World");
}
// ...
auto f = new Fiber(&foo);
f.call(); // Hello と表示
f.call(); // World と表示
この機能は1つのコアを複数のファイバーが協調的に共有する並行処理を 実装するのに使うことができます。スレッドと比べてファイバーが有利なのは、 コンテキストスイッチングの必要がないためリソース使用量が少ないところです。
この技術の、よりクリーンなコードに繋がると言う面でのファイバーの非常に良い使用例を、 ノンブロッキング(または非同期)I/O操作を実装している vibe.d フレームワークに見ることができます。