2014-03-01 23 views
2

我想知道,如果恢复尚未完成的协程时,从couroutine外部获取其栈中某个变量的引用是合法的。单向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(); 

感谢您的时间

回答

-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

+0

我想知道为什么我对此投反对票的原因是什么。 –

1

协程只有moeveable - 你需要在my_func,并将结束()返回科罗。

一般而言,myvar在协议栈上分配,您可以在应用程序中传递任意函数的引用或指针(myvar的内存位置地址)。除非堆栈解开(或至少包含myvar的堆栈框架),否则它是vaild。