【问题标题】:How to make a re-entrant Boost coroutine?如何制作一个可重入的Boost协程?
【发布时间】:2014-08-22 04:24:23
【问题描述】:

我正在使用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)();

【问题讨论】:

  • 泄漏怎么办?
  • @Manu343726 delete 为清楚起见未显示调用

标签: c++ boost coroutine


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我完全看不出每次都创建一个新的协程有什么问题——创建它们并不昂贵。

    如果您的协程中有很多数据,因此构建起来很昂贵,请将其全部移到某个数据类中,并将对它的引用传递给您的协程。

    【讨论】:

      猜你喜欢
      • 2010-10-11
      • 2020-06-07
      • 2010-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多