boost::asio::io_context::run()
确实在没有待处理的工作时返回。我想避免这种行为,以便run()
确实无限期地等待新作品,并有可能从另一个线程中阻止它。
我想,这可以通过在io_context
中启动一个无限长的计时器,并在我们希望cancel()
返回时在该计时器上调用run()
来完成。
这是一个正确的方法,有一个干净的方法来做到这一点?
你可以使用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