Нитки - спосіб реалізації паралелізму шляхом співробітництва. Визначення
класу Fiber
наведено у модулі core.thread
.
Основна ідея полягає у тому, що коли нитка залишається без діла або
очікує на додаткові вхідні дані, вона добровільно передає можливість
виконувати інструкції іншим ниткам, викликаючи функцію Fiber.yield()
.
Батьківський контекст знову отримує управління, але стан нитки,
а саме всі змінні на стеку, зберігається. Пізніше нитка може бути відновлена і продовжити
свою роботу з інструкції, яка слідує одразу ж за викликом Fiber.yield()
.
Магія? Саме так!
void foo() {
writeln("Привіт");
Fiber.yield();
writeln("Світ");
}
// ...
auto f = new Fiber(&foo);
f.call(); // Друкує "Привіт"
f.call(); // Друкує "Світ"
Ця можливість може бути використана для реалізації паралелізму, де безліч ниток спільно використовують одне ядро. Перевага ниток у порівнянні з потоками полягає у більш економному використанні ресурсів завдяки відсутності зміни контексту.
Вдале використання цієї техніки можна побачити у фреймворку vibe.d, в якому реалізовані неблокуючі (або асинхронні) операції вводу/виводу у контексті ниток, що дозволяє створювати більш лаконічний код.