在尝试破解asio应用程序的干净关闭时,我发现非常恼火,我不知道ios是否因为我调用.stop()或因为处理器耗尽而停止了。
此外,当我想要杀死它时,我无法找到一种方法来查看它是否在处理程序q中有处理程序,或者即使某些处理程序正在运行atm。
所以
1)任何方式来查看什么停止ios - 。停止或停止工作(除了可怕的手动bIsAppShuttingDown标志)
2)任何方式来看看io_service(在我调用stop之后)是否还在处理某些事情?
所以我可以写
ios->stop()
while(! ios.finished())
sleep(1) // :/
delete ios;
答案 0 :(得分:1)
通常,模式是在单独的线程中在io_service上分派,例如:
_thread.reset(new std::thread([&]() { _service.run(); }); // so the dispatching here is in a thread
随后,如果您想要停止并等待它干净利落,那么最好的方法是:
_service.stop();
_thread->join();
这样调用线程就会被阻塞,直到调度线程终止(这是在执行最后一个处理程序(run()
)的调用完成时发生的。没有办法(AFAIK)知道io_service是否用尽了工作或是否调用stop()
,您当然可以通过在服务上实例化io_service::work
来阻止前者。请参阅文档。