当没有更多工作要做时,防止boost :: asio :: io_context返回

时间:2019-02-18 16:13:17

标签: c++ boost-asio

没有工作挂起时,

boost::asio::io_context::run()确实会返回。我想避免这种行为,以便run()确实无限期地等待新作品,并有可能从另一个线程中停止它。

我想这可以通过在io_context中启动一个无限长的计时器,并在我们希望cancel()返回时在该计时器上调用run()来完成。

这是正确的方法吗,有没有一种干净的方法可以做到这一点?

1 个答案:

答案 0 :(得分:1)

您可以使用executor_work_guard。 在ctor中,它从io_context实例中获取执行器并在该执行器上调用on_work_started,这意味着io_context::run在没有工作要做时see reference不会结束。

  

这确保io_context的run()和run_one()函数可以   工作进行中不会退出。

所以简单的代码看起来像

  boost::asio::io_context io;
  boost::asio::executor_work_guard<decltype(io.get_executor())> work{io.get_executor()};

  io.run(); // [1]
  cout << "you will never see this line" << endl;

代码在1行中挂起。当调用io_context::run析构函数时,work可能会结束。

在较早的boost或asio版本上,等效类为io_service::work