Информация об изменениях

Сообщение Re[33]: cppcms от 24.09.2014 7:47

Изменено 24.09.2014 7:50 Evgeny.Panasyuk

Здравствуйте, 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
     }
}
Здравствуйте, 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
     }
}


Регистр указателя стэка подменяется в любом из этих случаев.