我想知道当恢复尚未完成的协程时,从couprine之外获取对其堆栈中的一个变量的引用是合法的。
像这样:
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();
感谢您的时间
答案 0 :(得分:1)
协同程序只能是可移动的 - 你需要在my_func()的末尾返回coro。
通常,myvar在coroutine的堆栈上分配,你可以将引用或指针传递给应用程序中的任意函数(myvar的内存位置地址)。除非堆栈被展开(或者至少是包含myvar的堆栈帧),否则它就是vaild。
答案 1 :(得分:-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。