如何等待所有boost:asio的堆栈协程完成?

妮基·楚马科夫(Nikki Chumakov)

我正在使用asio :: spawn启动许多协程,并且我想等到所有这些都完成后再做其他工作。怎么做?

控制流程如下:

asio::spawn (io, [] (asio::yield_context yield) {
  ...
  // starting few coroutines
  asio::spawn (yield, [] (asio::yield_context yield2) { ... });
  asio::spawn (yield, [] (asio::yield_context yield2) { ... });
  asio::spawn (yield, [] (asio::yield_context yield2) { ... });
  asio::spawn (yield, [] (asio::yield_context yield2) { ... });

  // now I want to wait for all of them to finish before I do 
  // some other work?
  ...
});

io.run ();

更新

下面是示例代码

#include <boost/asio.hpp>
#include <boost/asio/spawn.hpp>
#include <boost/asio/steady_timer.hpp>
#include <chrono>

#include <iostream>
using namespace std;

int main ()
{
  using namespace boost::asio;

  io_service io;

  spawn (io, [&] (yield_context yield) {
    cout << "main coro starts\n";

    auto lambda = [&] (yield_context yield)
      {
        cout << "in lambda inside subcoroutine - starts\n";
        steady_timer t (io, std::chrono::seconds (1));
        t.async_wait (yield);
        cout << "in lambda inside subcoroutine - finishes\n";
      };

    // starting few coroutines
    spawn (yield, lambda);
    spawn (yield, lambda);

    // now I want to wait for all of them to finish before I do
    // some other work?
    // ???

    cout << "main coro finishes\n";
  });

  io.run ();
}

输出为:

// main coro starts
// in lambda inside subcoroutine - starts
// in lambda inside subcoroutine - starts
// main coro finishes <----
// in lambda inside subcoroutine - finishes
// in lambda inside subcoroutine - finishes

虽然我期望:

// main coro starts
// in lambda inside subcoroutine - starts
// in lambda inside subcoroutine - starts
// in lambda inside subcoroutine - finishes
// in lambda inside subcoroutine - finishes
// main coro finishes

(请参阅“主要颜色完成”行的位置)

妮基·楚马科夫(Nikki Chumakov)

我找到了一种解决方法。

我可以使用无限长的计时器,并从上一个子协程中将其取消。这将唤醒主要协程。

Coliru示例

#include <boost/asio.hpp>
#include <boost/asio/spawn.hpp>
#include <boost/asio/steady_timer.hpp>

#include <iostream>
using namespace std;

int main ()
{
  using namespace boost::asio;

  io_service io;

  spawn (io, [&] (yield_context yield) {
    cout << "main coro starts\n";


    steady_timer rendez_vous (io, steady_timer::clock_type::duration::max ());
    /* volatile */ int counter = 2;


    auto lambda = [&] (yield_context yield)
      {
        cout << "in lambda inside subcoroutine - starts\n";
        steady_timer t (io, boost::chrono::seconds (1));
        t.async_wait (yield);
        cout << "in lambda inside subcoroutine - finishes\n";

        if (--counter == 0)
            rendez_vous.cancel ();
      };

    // starting few coroutines
    spawn (yield, lambda);
    spawn (yield, lambda);

    // now I want to wait for all of them to finish before I do
    // some other work?
    // ???
    boost::system::error_code ignored_ec;
    rendez_vous.async_wait (yield [ignored_ec]);
    // ignore errors here by reason.

    cout << "main coro finishes\n";
  });

  io.run ();
}

坦白说,我不喜欢这种解决方案,因为它滥用了“计时器”的概念和对象,并且可能浪费系统资源。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Kotlin协程壁垒:等待所有协程完成

来自分类Dev

如何等待协程结束

来自分类Dev

如何等待所有NSOperations完成?

来自分类Dev

如何等待协程Dispatch.IO数据库查询完成以填充RecyclerView

来自分类Dev

调用并行协程并等待所有协程结束

来自分类Dev

如何等待并正确从异步协程返回值

来自分类Dev

如何等待协程,直到满足条件?

来自分类Dev

协程如何等待数据然后继续处理

来自分类Dev

如何等待所有诺言完成然后采取行动?

来自分类Dev

如何等待所有异步完成?

来自分类Dev

如何等待所有请求完成?

来自分类Dev

如何等待循环中的所有踏板完成运行

来自分类Dev

如何等待所有动画在jQuery中完成?

来自分类Dev

如何等待所有 jquery 加载完成

来自分类Dev

如何在fork上克隆Boost ASIO协程?

来自分类Dev

如何等待异步方法中的等待完成所有执行?

来自分类Dev

使用boost :: asio无堆栈协程通过HTTP下载多个文件

来自分类Dev

完成所有生产者协程后如何关闭渠道?

来自分类Dev

如何等待IAsyncEnumerable <>的所有结果?

来自分类常见问题

如何等待所有异步调用完成

来自分类Dev

如何等待Akka.Net中的所有工作完成?

来自分类Dev

同步Ajax调用-或:如何等待所有内容加载完成?

来自分类Dev

RxJava测试:如何等待所有后台任务完成

来自分类Dev

你如何等待所有异步调用在Java中完成?

来自分类Dev

Google Maps Directions服务,如何等待所有请求完成?

来自分类Dev

如何等待所有异步调用完成

来自分类Dev

同步Ajax调用-或:如何等待所有内容加载完成?

来自分类Dev

如何等待ThreadPoolExecutor中的所有任务在超时内完成而又不关闭Executor?

来自分类Dev

我如何等待Indy线程池中的所有线程完成

Related 相关文章

  1. 1

    Kotlin协程壁垒:等待所有协程完成

  2. 2

    如何等待协程结束

  3. 3

    如何等待所有NSOperations完成?

  4. 4

    如何等待协程Dispatch.IO数据库查询完成以填充RecyclerView

  5. 5

    调用并行协程并等待所有协程结束

  6. 6

    如何等待并正确从异步协程返回值

  7. 7

    如何等待协程,直到满足条件?

  8. 8

    协程如何等待数据然后继续处理

  9. 9

    如何等待所有诺言完成然后采取行动?

  10. 10

    如何等待所有异步完成?

  11. 11

    如何等待所有请求完成?

  12. 12

    如何等待循环中的所有踏板完成运行

  13. 13

    如何等待所有动画在jQuery中完成?

  14. 14

    如何等待所有 jquery 加载完成

  15. 15

    如何在fork上克隆Boost ASIO协程?

  16. 16

    如何等待异步方法中的等待完成所有执行?

  17. 17

    使用boost :: asio无堆栈协程通过HTTP下载多个文件

  18. 18

    完成所有生产者协程后如何关闭渠道?

  19. 19

    如何等待IAsyncEnumerable <>的所有结果?

  20. 20

    如何等待所有异步调用完成

  21. 21

    如何等待Akka.Net中的所有工作完成?

  22. 22

    同步Ajax调用-或:如何等待所有内容加载完成?

  23. 23

    RxJava测试:如何等待所有后台任务完成

  24. 24

    你如何等待所有异步调用在Java中完成?

  25. 25

    Google Maps Directions服务,如何等待所有请求完成?

  26. 26

    如何等待所有异步调用完成

  27. 27

    同步Ajax调用-或:如何等待所有内容加载完成?

  28. 28

    如何等待ThreadPoolExecutor中的所有任务在超时内完成而又不关闭Executor?

  29. 29

    我如何等待Indy线程池中的所有线程完成

热门标签

归档