gpt4 book ai didi

c++ - 我可以使用 Boost 1.55 构建双向协程吗?

转载 作者:IT老高 更新时间:2023-10-28 22:30:13 25 4
gpt4 key购买 nike

当前的 Boost 1.55 实现提供了两种 unidirectional coroutines .一种是拉式,是一种不带参数,返回值给主上下文的协程;另一种是push-type,它是一个从主上下文接受参数但不返回值的协程。

如何将这两者结合起来创建一个既接受参数又返回值的双向协程?从表面上看,这似乎应该是可能的,但我无法完全弄清楚如何使用 boost::coroutine 中的构建 block 来做到这一点。在旧的 Boost 中曾经有一个双向协程,但它现在已被弃用且未记录在案,所以我不应该依赖它。

即,我想要类似的东西:

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
}
}

最佳答案

实际上,boost协程在首次包含在boost(我认为是1.53)时是双向的。

http://www.boost.org/doc/libs/1_53_0_beta1/libs/coroutine/doc/html/coroutine/coroutine.htm

该代码仍应与最新版本的 boost 兼容,如果有的话,只需稍作修改。

另外,你可以直接使用 boost::context 来创建你自己的协程类。

http://www.boost.org/doc/libs/1_55_0/libs/context/doc/html/index.html

fcontext_swap 的参数“intptr_t vp”可用于来回传递值/指针,或者您可以将值存储在协程本身中,因为协程类的成员变量应该在两种上下文中都有效。

编辑:

您最初的问题的简短回答是否定的。你所要求的无法完成。每个协程都有自己的堆栈和上下文,其他协程实例无法访问它们。另外,当你跳转到协程的上下文时,调用上下文的状态存储在那个协程实例中,并且只能通过调用的参数来跳转回原来的上下文。 >那个协程传入你的函数。

但是,在协程本地范围之外声明的变量在协程函数内部和外部都是有效的。所以你可以使用 coroutine::push_type,并推送一个指针而不是一个值。您可以使用该值,然后在跳回原始上下文之前对其进行修改。

此外,您可以安全地将指向局部变量的指针传递给协程,因为在您跳出协程并运行调用范围完成之前,它们不会被销毁。

关于c++ - 我可以使用 Boost 1.55 构建双向协程吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20711504/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com