Question

While trying to hack clean shutdown of asio app I find it quite irritating that I cant know if ios stopped because i called .stop() or because it run out of handlers.
Also when I want to kill it I cant find a way to see if it has handler in its handlers q, or even if some handlers are running atm.
So
1) Any way to see what stopped ios - .stop or running out of work (except the awful manual bIsAppShuttingDown flag )
2) Any way to see if io_service (after I called stop) is still processing something? so I can write

ios->stop()
while(! ios.finished())
sleep(1) // :/
delete ios;
Was it helpful?

Solution

Typically the pattern is to dispatch on the io_service in a separate thread, for example:

_thread.reset(new std::thread([&]() { _service.run(); }); // so the dispatching here is in a thread

Subsequently, if you want to stop it and wait for it to finish cleanly, then the best way is:

_service.stop();
_thread->join();

This way the calling thread is blocked until the dispatch thread terminates (which happens when the call to execute the last handler (run()) completes. There is no way (AFAIK) of knowing whether the io_service ran out of work or whether stop() was called, you can certainly prevent the former by instantiating an io_service::work on the service. See the docs.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top