Fibras

Fibras são uma forma de implementar a concorrência de forma cooperativa. A classe Fiber é definida no módulo core.thread.

A ideia básica é que, quando uma fibra não tem nada para fazer ou espera por mais entrada, ela ativamente abre mão de sua possibilidade de executar instruções chamando Fiber.yield(). O contexto principal ganha controle novamente, mas o estado da fibra - todas as variáveis na pilha - são salvas. A fibra pode então ser retomada e continuará na instrução logo depois de chamar Fiber.yield().

void foo() {
    writeln("Hello");
    Fiber.yield();
    writeln("World");
}
// ...
auto f = new Fiber(&foo);
f.call(); // Imprime Hello
f.call(); // Imprime World

Esse recurso pode ser usado para implementar a concorrência em que várias fibras compartilham cooperativamente um único núcleo. A vantagem das fibras em relação as threads é que seu uso de recursos é menor porque não há troca de contexto envolvida.

Um uso muito bom dessa técnica pode ser visto em vibe.d, que implementa operações de E/S não bloqueantes (ou assíncronas) em termos de fibras, o que resulta em um código muito mais limpo.

Maiores detalhes

rdmd playground.d