Fibers are a way to implement concurrency
in a cooperative fashion. The class Fiber
is defined in the module core.thread.
The basic idea is that when a fiber
has nothing to do or waits for more input, it
actively gives away its possibility to
execute instructions by calling Fiber.yield().
The parent context gains control again but the
fiber's state - all variables on the stack - are
saved. The fiber can then be resumed
and will continue at the instruction right after
it called Fiber.yield(). Magic? Yes.
void foo() {
writeln("Hello");
Fiber.yield();
writeln("World");
}
// ...
auto f = new Fiber(&foo);
f.call(); // Prints Hello
f.call(); // Prints World
This feature can be used to implement concurrency where multiple fibers cooperatively share a single core. The advantage of fibers compared to threads is that their resource usage is lower because no context switching is involved.
A very good usage of this technique can be seen in the vibe.d framework which implements non-blocking (or asynchronous) I/O operations in terms of fibers leading to much cleaner code.