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

问题描述 投票:0回答:1

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

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

这是一个正确的方法,有一个干净的方法来做到这一点?

c++ boost-asio
1个回答
2
投票

你可以使用executor_work_guard。在ctor中,它从io_context实例获取执行者并在此执行器上调用on_work_started,这意味着当没有工作做io_context::runsee 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

© www.soinside.com 2019 - 2024. All rights reserved.