Корутини (Coroutines) — це потужний інструмент програмування, який дозволяє реалізувати кооперативне багатозавдання без накладних витрат, характерних для традиційних потоків.
Цей підхід дозволяє зручно керувати паралельними задачами, розділяючи виконання на невеликі етапи, де кожен етап добровільно передає управління назад викликаючій функції, а не за допомогою операційної системи.
Корутини ідеально підходять для:
- Реалізації генераторів і ітераторів
- Керування станами в іграх
- Обробки асинхронного вводу/виводу
- Спрощення складних логічних потоків
- Ресурсоефективної паралельності
Ця бібліотека корутин надає спосіб написання конкурентного коду без необхідності працювати з потужними, але складними потоками. Вона підтримує:
- Легкі корутини з налаштовуваними розмірами стеків
- Потокобезпечні операції з використанням мютексів
- Ефективне планування за принципом кругового обміну
- Неблокуючий ввід/вивід з використанням функції poll()
- Повний обробник помилок
- Автоматичне очищення ресурсів
Основними компонентами бібліотеки є структури для визначення планувальника корутин. Для реалізації створення і управління корутинами використовуються прості, але потужні конструкції, які дозволяють ефективно маніпулювати даними і виконувати контекстні перемикання.
Планувальник корутин реалізує:
- Створення та знищення корутин
- Модифікацію стану планувальника
- Виділення та очищення стеків
- Генерацію ID корутин
- Операції з масивами та управління ввід/вивід
У бібліотеці також є підтримка неблокуючого вводу/виводу через poll(), що дозволяє створювати ефективні асинхронні програми.
Приклад використання цієї бібліотеки показує, як створити та виконати кілька корутин, кожна з яких виконує свою роботу в окремому потоці, використовуючи мінімальний набір функцій для ініціалізації, зупинки та управління корутинами. Цей підхід дозволяє розробникам зосередитися на логіці програми, а не на складностях паралельного програмування.
Перекладено з: Building a Practical Thread-Safe Coroutine Library in C from Scratch