Boost.coroutine unidirectional:在暂停时获得对堆栈变量的引用是合法的吗?

时间:2014-03-01 05:12:48

标签: c++ boost coroutine

我想知道当恢复尚未完成的协程时,从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();

感谢您的时间

2 个答案:

答案 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。