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