Здравствуйте, artelk, Вы писали:
EP>>Вывод:
EP>>EP>>Thread ID 139987868124992 in main begin
EP>>Thread ID 139987838420736 in coro begin
EP>>Thread ID 139987868124992 in coro end
EP>>Thread ID 139987868124992 in main end
EP>>
EP>>
A>Запускающий поток держится, чтобы управление вернулось именно в него.
Пример показывает, что запускается корутина в одном потоке, yield'ится, а потом продолжает работу в другом, когда первый уже завершился
Да, корутина запускается каким-то из потоков и работает в потоке (очевидно), и "держит" его во время работы. При этом поток спокойно может передать спящую корутину другому потоку, чтобы она выполнялась в нём. В чём проблема-то?
A>В сервисе это нафиг не нужно (в UI да, нужно). Запускающий поток там — это один из потоков пула (т.н. worker thread или iocp thread).
A>Т.е. хотелось бы, чтобы yield() из примера отпускал поток обратно в пул, а после yield() управление мог взять любой другой поток пула.
Не пойму о какой проблеме ты говоришь, опиши задачу конкретнее.
Состояние спящей stackful корутины, это по сути набор регистров + стэк, то есть просто "кусок памяти". Имея этот "кусок памяти" корутину можно продолжить в любом потоке. Это позволяет реализовывать самые разнообразные сценарии.
Вообще, я тебе вот в
этой веткеАвтор: Evgeny.Panasyuk
Дата: 26.06.13
уже показывал, что stackful coroutine (Boost.Coroutine) мощнее stackless (C# await), потом ты куда-то исчез и теперь рассказываешь про "макаронную фабрику".