首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我能用Boost 1.55建立一个双向协同线吗?

我能用Boost 1.55建立一个双向协同线吗?
EN

Stack Overflow用户
提问于 2013-12-20 20:31:44
回答 2查看 1.2K关注 0票数 15

当前的Boost 1.55实现提供了两种单向协同线。一种是拉式,它是不接受参数并将值返回给主上下文的协同线;另一种是推送类型,它是接受主上下文中的参数但不返回值的协同线。

如何将这两者结合起来创建一个双向协同线,既接受一个参数又返回一个值?从表面上看,这似乎是可能的,但我不太清楚如何使用我在boost::coroutine中的构建块。以前在旧的助推器中有一个双向协同,但是现在它已经被废弃并且没有文档化了,所以我不应该依赖它。

呃,我想要一些类似这样的东西:

代码语言:javascript
运行
复制
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
   }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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,然后推送一个指针而不是一个值。您可以使用该值,然后在跳回原始上下文之前对其进行修改。

此外,您还可以将指向局部变量的指针安全地传递到协同线中,因为它们将不会被销毁,直到您跳出协同线并运行调用范围才能完成。

票数 6
EN

Stack Overflow用户

发布于 2013-12-21 11:28:46

您可以查看boost.coroutine https://github.com/boostorg/coroutine/blob/master/example/cpp03/chaining.cpp中包含的示例。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20711504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档