Re[33]: cppcms
От: Evgeny.Panasyuk Россия  
Дата: 24.09.14 07:47
Оценка: 1 (1)
Здравствуйте, artelk, Вы писали:

EP>>Он не копируется в другой поток. Грубо говоря стэк передаётся как указатель.

EP>>Т.е. даже когда корутина работает то в одном потоке, то в другом — стэк у неё тот же самый.
A>Хмм.. а если исходный поток умер и его стэковая память отдается под другие нужды? Или стэк делается в куче и регистр указателя стека подменяется, чтоб указывал туда?

Обычно, память под стэк корутины выделяется в куче, и соответственно она может пережить создавший её поток (как это показано в примере выше).

А вообще, память под стэк корутины можно выделить и в стэке создающего потока, но тогда нужно следить за тем чтобы стэк корутины пережил её выполнение. Схематично:
{
     char stack_for_coroutine[1u << 20]; // created on stack
     {
         Coroutine coro( use_this_buffer_as_stack(stack_for_coroutine) );
         // do job
         // end of coroutine execution
     }
}


Регистр указателя стэка подменяется в любом из этих случаев.
Отредактировано 24.09.2014 7:51 Evgeny.Panasyuk . Предыдущая версия . Еще …
Отредактировано 24.09.2014 7:50 Evgeny.Panasyuk . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.