В информатике рутины определяются как последовательность операций. Выполнение рутины формирует отношения между родителем и ребенком, и ребенок прекращается всегда перед родителем. Корутины (термин был введен Мелвином Конвеем ), являются обобщением рутин (Дональд Кнут ). Основное различие между корутинами и рутинами заключается в том, что корутин позволяет явно приостановить и возобновить свой прогресс с помощью дополнительных операций, сохраняя состояние исполнения и, таким образом, обеспечивает расширенный поток управления (поддержание контекста исполнения).
Функции foo() и bar() должны чередовать свое исполнение (уходить и входить в функциональное тело).

Если бы корутины назывались точно так же, как рутины, стек рос бы с каждым звонком и никогда бы не лопнул. Скачок в середину корутина невозможен, потому что обратный адрес будет поверх записей стека.
Решение состоит в том, что каждый корутин имеет свой собственный стек и блок управления (boost::contexts::fcontext_t из Boost.Context). До приостановки работы корутина энергонезависимые регистры (включая стек и указатель инструкции/программы) действующего корутина хранятся в блоке управления корутина. Регистры вновь активированного корутина должны быть восстановлены из соответствующего контрольного блока до его возобновления.
Переключатель контекста не требует системных привилегий и обеспечивает удобную для C++ совместную многозадачность. Корутина обеспечивает квазипараллельность. Когда программа должна делать несколько вещей одновременно, корутин помогает сделать это гораздо проще и изящнее, чем при одном потоке управления. Преимущества можно увидеть особенно четко с использованием рекурсивной функции, такой как обход двоичных деревьев (см. пример «та же бахрома»).
Характеристики корутина:
- значения локальных данных сохраняются между последовательными вызовами (переключателями)
- исполнение приостанавливается, поскольку контроль покидает корутин и возобновляется в определенное время позже
- симметричный или асимметричный механизм передачи управления; см. ниже
- объект первого класса (может быть передан в качестве аргумента, возвращен процедурами, сохранен в структуре данных для последующего использования или свободно манипулировать разработчиком)
- сложенный или без стека
Корутины полезны в симуляции, искусственном интеллекте, параллельном программировании, обработке текста и манипулировании данными, поддерживая реализацию таких компонентов, как совместные задачи (волокна), итераторы, генераторы, бесконечные списки, трубы и т. Д.
Существуют две категории корутин: симметричные и асимметричные.
Асимметричный корутин знает своего инициатора, используя специальную операцию, чтобы неявно передать контроль именно своему инициатору. Напротив, все симметричные корутины эквивалентны; один симметричный корутин может передавать управление любому другому симметричному корутину. Из-за этого симметричный корутин должен указывать корутин, которому он намерен дать контроль.

Оба понятия эквивалентны, и полностью общая библиотека может обеспечить либо симметричные, либо асимметричные координаты.
В отличие от стекового корутина, стековый корутин может быть приостановлен внутри вложенного стекфрейма. Исполнение возобновляется в том же месте кода, где оно было приостановлено ранее. При бескомпактной рутине может быть приостановлена только рутина верхнего уровня. Любая рутина, называемая этой рутиной высшего уровня, сама по себе не может быть приостановлена. Это запрещает приостановку/возобновление операций в рутине в библиотеке общего назначения.
Продолжение первого класса может быть передано в качестве аргумента, возвращено функцией и сохранено в структуре данных для последующего использования. В некоторых реализациях (например, C# yield) к продолжению нельзя получить прямой доступ или непосредственно манипулировать им.
Без укладки и первоклассной семантики некоторые полезные потоки управления исполнением не могут поддерживаться (например, совместная многозадачность или контрольно-пропускной пункт).