任何获得有关io_service的附加信息的方法
问题描述:
在尝试破解asio应用程序的干净关闭时,我发现它令我非常恼火,因为我调用了.stop()或者因为它没有处理程序而导致ios停止。
另外,当我想杀死它时,我无法找到一种方法来查看它是否在其处理程序中具有处理程序,或者即使某些处理程序正在运行atm。
所以
1)任何办法看到停IOS - .stop或用完工作(任何方式除了可怕的手动bIsAppShuttingDown标志)
2),看看是否io_service对象(之后我叫停止)仍在处理一些? 这样我就可以写任何获得有关io_service的附加信息的方法
ios->stop()
while(! ios.finished())
sleep(1) // :/
delete ios;
答
通常的模式是派遣在一个单独的线程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
来阻止前者。看文档。
那么,如果您停止()io_service,则所有未完成的异步操作都应使用operation_aborted错误代码调用它们的处理程序,以便您可以检查io_service是停止还是不工作。 – DeVadder