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

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

Оба понятия эквивалентны, и полностью общая корутинная библиотека может обеспечить либо симметричные, либо асимметричные корутины. Для удобства, наслаждайтесь. Корутин предоставляет оба.
В отличие от бесстекной корутины, стеклянный корутин может быть оторван из вложенного стекфрейма. Исполнение возобновляется в тот же момент в коде, где оно было приостановлено ранее. С бесстекной корутиной может быть приостановлена только рутина верхнего уровня. Любая рутина, вызванная этой рутиной верхнего уровня, сама по себе не может приостановиться. This prohibits providing suspension/resume operations in routines within a general- purposes library.
Продолжение первого класса может быть передано в качестве аргумента, возвращено функцией и сохранено в структуре данных, которая будет использоваться позже. В некоторых реализациях (например, C# yield) продолжение не может быть напрямую доступно или непосредственно манипулировано.
Без стека и первоклассной семантики некоторые полезные потоки управления исполнением не могут быть поддержаны (например, кооперативная многозадачность или контрольно-пропускные пункты).