Re[29]: cppcms
От: Evgeny.Panasyuk Россия  
Дата: 24.09.14 06:48
Оценка:
Здравствуйте, 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), потом ты куда-то исчез и теперь рассказываешь про "макаронную фабрику".
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.