我可以用Boost 1.55构建一个双向协同程序吗
Can I build a bidirectional coroutine with Boost 1.55?
当前的Boost 1.55实现提供了两种单向协程。一种是pull类型,它是一个不接受参数并向主上下文返回值的协程;另一种是push类型,它是一个从主上下文接受参数但不返回值的协程。
如何将这两者结合起来,创建一个既接受参数又返回值的双向协程?从表面上看,这似乎是可能的,但我不太清楚如何使用boost::coroutine
中的构建块来实现。以前在旧的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"可以用于来回传递值/指针,也可以将值存储在协程本身中,因为协程类的成员变量在这两个上下文中都应该有效。
编辑:
对你最初的问题的简短回答是否定的。你所要求的是做不到的。每个协程都有自己的堆栈和上下文,其他协程实例无法访问这些堆栈和上下文。此外,当您跳转到协同程序的上下文时,调用上下文的状态存储在该协同程序实例中,并且只能通过调用传递到函数中的参数来跳回到原始上下文。
但是,在协程局部范围之外声明的变量在协程函数内外都是有效的。因此,您可以使用协程::push_type,并推送指针而不是值。您可以使用该值,然后在跳回原始上下文之前对其进行修改。
此外,您可以安全地将指向局部变量的指针传递到协程中,因为在您跳回协程并运行调用范围直到完成之前,它们不会被销毁。
您可以查看boost.coroutine中包含的示例https://github.com/boostorg/coroutine/blob/master/example/cpp03/chaining.cpp
- 我试图制作一个程序,要求用户输入问题和答案,但程序循环不正确
- 我写了一个C++程序来模拟Enigma机器.我没有得到输出
- 如何使用C++读取另一个程序中的源代码输出
- 3-3. 编写一个程序来计算每个不同单词在其输入中出现的次数
- 我的目标是编写一个程序来计算和存储字符串在字符数组中出现的位置
- 使用另一个程序调用正在运行的 C++ 程序中的函数
- 我正在尝试制作一个程序,在添加 n 天(整数)后告诉一个人什么是一天(例如星期一等)
- 编写一个程序,帮助Tudio将MIDI音符转换为名称和八度音阶
- 有没有办法在一个C++程序中同时使用 FFTW 和 cuFFTW?
- 一个C++程序,用于在输入位数时输出具有特定位数的 .txt 文件中的所有数字
- C++将结构复制到另一个程序的资源
- 我编写了一个程序来显示数组的内容,但它显示的是它的地址
- 我已经做了一个程序来使用队列链C++表显示学生姓名和身高,现在我想以我不知道如何显示的顺序显示它
- 我需要编写一个程序来读取一个文件,该文件将输出所有唯一的整数,如果已经看到整数,它将被关闭
- 仅在 boost::hash_combine 中运行一个程序期间保证确定性
- 如何制作一个程序,它使用特定单词加密和解密消息?
- 尝试创建一个程序来查找非二叉树的高度.最终得到一个很长的循环,没有答案
- 编写一个程序,提示用户输入一个整数,然后输出数字的单个数字和数字的总和
- 如何编写一个程序来打印特定基数的前N个数字
- 如何创建一个C++程序来读取字符串数组中的信息,然后将其排序到类中?