如何制作一个可重入的Boost协同程序?

时间:2014-07-01 14:45:25

标签: c++ boost coroutine

我正在使用Boost coroutine library,我需要我的协程可以重新进入。

这意味着我应该能够多次启动协程从头开始

有哪些选择?

我目前的解决方法是每次都重新创建新的协程:

boost::coroutines::coroutine<int>::pull_type *source = new boost::coroutines::coroutine<int>::pull_type(
            [&](boost::coroutines::coroutine<int>::push_type& sink){
    sink(0);
    cout << "Hello world!" << endl;
});
(*source)();

source = new boost::coroutines::coroutine<int>::pull_type(
            [&](boost::coroutines::coroutine<int>::push_type& sink){
    sink(0);
    cout << "Hello world!" << endl;
});
(*source)();

source = new boost::coroutines::coroutine<int>::pull_type(
            [&](boost::coroutines::coroutine<int>::push_type& sink){
    sink(0);
    cout << "Hello world!" << endl;
});
(*source)();

2 个答案:

答案 0 :(得分:1)

因为来自boost.coroutine的协程是stackfull,所以你不能多次启动它们。 从您的示例中不清楚您想要做什么:

  • 打印“Hello world!”多次 - &gt;在coro-fn中使用循环
  • 某种回溯/检查点 - &gt;可以用coroutiens完成,但需要一些额外的工作

答案 1 :(得分:0)

我根本不知道每次创建一个新鲜的协程有什么问题 - 创建它们并不昂贵。

如果您的协程中有大量数据,那么构建起来很昂贵,请将其全部移到某个数据类中,并将引用传递给您的协程。