Здравствуйте, DemAS, Вы писали:
DAS>1. Буду благодарен за пример проблемы, в решении которой coroutines не
DAS>притянуты за уши.
В луа, например, корутины обыденная часть языка, и есть много чего почитать от научных статей до конкретных паттернов применения:
Revisiting Coroutines (оч. рекомендую)
Token Filters(типичный пример применения)
PIL: Coroutine Basics
http://lua-users.org/wiki/FiltersSourcesAndSinks
http://lua-users.org/wiki/CoroutinesAsEventHandlers
http://lua-users.org/wiki/CoroutinesAsConnectionHandlers
http://lua-users.org/wiki/FunWithCoroutines
У меня обычный случай применения: либо итератор для разлапистой структуры данных, либо низкоуровневый кирпич для чего-нибудь более интересного. На основе корутин (по крайней мере если они кооперативные треды как в луа) можно реализовать более высокоуровневый набор примитивов, например
CSP —
OCCAM —
Limbo —
Stackless Python.
Events vs. Threads
Bell Labs and CSP Threads
DAS>2. Вопрос по реализации. Если я правильно понимаю, между вызовами coroutine
DAS>ее состояние(локальные переменные и точка возврата) должна где-то
DAS>сохраняться. Где она сохраняется? Неужели в стеке?
В луа корутина — просто кооперативный тред со своим стеком (примерно как в erlang). Занимает примерно 1K(тоже примерно как в erlang) — можно завести их сотни тысяч.
Хороший обзор методов реализации есть в документации luajit:
Context Switching Methods
Вот еще известный документ:
Coroutines in C