Menu

Нитки (Fibers)

Нитки - спосіб реалізації паралелізму шляхом співробітництва. Визначення класу Fiber наведено у модулі core.thread.

Основна ідея полягає у тому, що коли нитка залишається без діла або очікує на додаткові вхідні дані, вона добровільно передає можливість виконувати інструкції іншим ниткам, викликаючи функцію Fiber.yield(). Батьківський контекст знову отримує управління, але стан нитки, а саме всі змінні на стеку, зберігається. Пізніше нитка може бути відновлена і продовжити свою роботу з інструкції, яка слідує одразу ж за викликом Fiber.yield(). Магія? Саме так!

void foo() {
    writeln("Привіт");
    Fiber.yield();
    writeln("Світ");
}
// ...
auto f = new Fiber(&foo);
f.call(); // Друкує "Привіт"
f.call(); // Друкує "Світ"

Ця можливість може бути використана для реалізації паралелізму, де безліч ниток спільно використовують одне ядро. Перевага ниток у порівнянні з потоками полягає у більш економному використанні ресурсів завдяки відсутності зміни контексту.

Вдале використання цієї техніки можна побачити у фреймворку vibe.d, в якому реалізовані неблокуючі (або асинхронні) операції вводу/виводу у контексті ниток, що дозволяє створювати більш лаконічний код.

Поглиблення

rdmd playground.d