Boost.coroutine однонаправленный: законно ли получить ссылку на переменную стека при приостановке?

Я хотел бы знать, допустимо ли при возобновлении сопрограммы, которая еще не завершилась, получить ссылку на одну из переменных в ее стеке извне процедуры.

Как это:

coroutine<void>::pull_type myclass::my_func() {
auto coro = [this](coroutine<void>::push_type & sink) {
auto myvar = 25;
this->do_something_with_my_var_by_ref_when_suspended(myvar);
sink();
while (1) {
//...
sink();
}
};
}

auto coro = this->myfunc();
//Here myvar from coro is being used but coro is suspended.
//Will myvar be valid? coro is not finished yet.
this->do_something_with_myvar_when_coro_suspended();

Спасибо за ваше время

2

Решение

сопрограммы могут быть изменены — вам нужно вернуть coro в конце my_func ().

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

1

Другие решения

Поэтому я сделал себе небольшую программу. Кажется, это доказывает, что это работает правильно в случае, который я спросил, но я все еще не могу понять, почему это делает странные вещи в другом коде, который у меня есть.

#include <boost/coroutine/all.hpp>

using namespace boost::coroutines;

int * g_i = nullptr;

coroutine<void>::pull_type
my_func() {
coroutine<void>::pull_type coro(
[](coroutine<void>::push_type & suspend_coro) {
int i = 7;
g_i = &i;
suspend_coro();
++i;
g_i = &i;
suspend_coro();
});

return coro;
}int main(int argc, char * argv[]) {
auto coro = my_func();
std::cout << *g_i << std::endl;
coro();
std::cout << *g_i << std::endl;
}

Отпечатки 7 и 8.

-1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector