Сопрограммы могут быть полезны в любое время, когда в системе есть два или более фрагмента кода, наиболее естественным представлением которых будет последовательная последовательность шагов, которые требуют много ожидания.
Например, рассмотрим устройство, которое имеет пользовательский интерфейс с ЖК-дисплеем и модемом, и ему необходимо использовать модем для периодического вызова и отчета о своем состоянии независимо от того, что делает пользователь на клавиатуре. Самый хороший способ написания пользовательского интерфейса может заключаться в использовании таких функций, как "input_numeric_value (& CONV_SPEED_FORMAT, & transpor_speed);" которая будет возвращаться, когда пользователь ввел значение, и самый хороший способ обработки связи может быть использовать функции, такие как "wait_for_carrier ();" которая вернется, когда устройство либо подключится, либо определит, что не собирается.
Без сопрограмм либо подсистему пользовательского интерфейса, либо подсистему модема пришлось бы реализовывать с использованием конечного автомата. Использование сопрограмм позволяет писать обе подсистемы в наиболее естественном стиле. Обратите внимание, что важно, чтобы ни одна подсистема никогда не работала очень долго, не переводя вещи в «непротиворечивое» состояние и не вызывая yield (), и не вызывая yield (), не переводя вещи сначала в «непротиворечивое» состояние, но обычно это не сложно ограничения.
Обратите внимание, что хотя можно использовать полноценную многозадачность, для этого требуется повсеместное использование блокировок при любом изменении общего состояния. Поскольку переключатель сопрограмм никогда не будет переключать вещи, кроме как при вызове yield (), любая из этих процедур может свободно изменять общее состояние, если она гарантирует, что все в порядке до следующего выхода, и готова для другой процедуры изменить состояние " во время "выхода" ().