当前的Boost 1.55实现提供了两种单向协同线。一种是拉式,它是不接受参数并将值返回给主上下文的协同线;另一种是推送类型,它是接受主上下文中的参数但不返回值的协同线。
如何将这两者结合起来创建一个双向协同线,既接受一个参数又返回一个值?从表面上看,这似乎是可能的,但我不太清楚如何使用我在boost::coroutine
中的构建块。以前在旧的助推器中有一个双向协同,但是现在它已经被废弃并且没有文档化了,所以我不应该依赖它。
呃,我想要一些类似这样的东西:
void accumulate( pull_func &in, push_func &out )
{
int x = 0;
while ( in )
{
x += in.get() ; // transfers control from main context
out(x); // yields control to main context
}
}
void caller( int n )
{
bidirectional_coro( accumulate );
for ( int i = 0 ; i < n ; ++i )
{
int y = accumulate(i);
printf( "%d ", y ); // "0 1 3 6 10" etc
}
}
发布于 2013-12-23 18:41:51
实际上,boost coroutine最初包含在boost中时是双向的(我认为是1.53)。
beta1/libs/coroutine/doc/html/coroutine/coroutine.htm
该代码仍应与最新版本的boost兼容,只要稍加修改即可。
另外,您可以直接使用boost::context来创建您自己的coroutine类。
0/libs/html/doc/html/index.html
Intptr_t的参数‘fcontext_swap vp’可以用来来回传递值/指针,也可以将值存储在coroutine本身中,因为coroutine类的成员变量在这两个上下文中都应该是有效的。
编辑:
对你最初问题的简短回答是否定的。你所要求的是做不到的。每个协同线都有自己的堆栈和上下文,其他协同器实例无法访问这些堆栈和上下文。另外,当您跳入coroutine的上下文时,调用上下文的状态存储在中,即 coroutine实例,只有调用coroutine传递给您的函数的参数,才能返回原始上下文。
但是,在coroutine的局部范围外声明的变量将在coroutine函数的内部和外部有效。所以您可以使用一个coroutine::push_type,然后推送一个指针而不是一个值。您可以使用该值,然后在跳回原始上下文之前对其进行修改。
此外,您还可以将指向局部变量的指针安全地传递到协同线中,因为它们将不会被销毁,直到您跳出协同线并运行调用范围才能完成。
发布于 2013-12-21 11:28:46
您可以查看boost.coroutine https://github.com/boostorg/coroutine/blob/master/example/cpp03/chaining.cpp中包含的示例。
https://stackoverflow.com/questions/20711504
复制相似问题