Сообщение Re[33]: cppcms от 24.09.2014 7:47
Изменено 24.09.2014 7:51 Evgeny.Panasyuk
Здравствуйте, artelk, Вы писали:
EP>>Он не копируется в другой поток. Грубо говоря стэк передаётся как указатель.
EP>>Т.е. даже когда корутина работает то в одном потоке, то в другом — стэк у неё тот же самый.
A>Хмм.. а если исходный поток умер и его стэковая память отдается под другие нужды? Или стэк делается в куче и регистр указателя стека подменяется, чтоб указывал туда?
Обычно, память под стэк корутины выделяется в куче, и соответственно она может пережить создавший её поток (как это показано в примере выше).
А вообще, память под стэк корутины можно выделить и в стэке создающего потока, но тогда нужно следить за тем чтобы стэк корутилы пережил её выполнение. Схематично:
Регистр указателя стэка подменяется в любом из этих случаев.
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
}
}
Регистр указателя стэка подменяется в любом из этих случаев.
Re[33]: cppcms
Здравствуйте, artelk, Вы писали:
EP>>Он не копируется в другой поток. Грубо говоря стэк передаётся как указатель.
EP>>Т.е. даже когда корутина работает то в одном потоке, то в другом — стэк у неё тот же самый.
A>Хмм.. а если исходный поток умер и его стэковая память отдается под другие нужды? Или стэк делается в куче и регистр указателя стека подменяется, чтоб указывал туда?
Обычно, память под стэк корутины выделяется в куче, и соответственно она может пережить создавший её поток (как это показано в примере выше).
А вообще, память под стэк корутины можно выделить и в стэке создающего потока, но тогда нужно следить за тем чтобы стэк корутины пережил её выполнение. Схематично:
Регистр указателя стэка подменяется в любом из этих случаев.
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
}
}
Регистр указателя стэка подменяется в любом из этих случаев.