Subject: Re: [boost] [ASIO] Safely shut down timer thread in boost::asio::io_service in Windows DLL
From: Bo Peng (elapsing_at_[hidden])
Date: 2013-10-03 18:58:48
Thanks for your reply. You solution will definitely work for my case.
>From a defensive programming point of view, it would still be nice to
automatically clean all the resource during dll unloading, and it would be
useful if user unloads the dll but doesn't shut down the process. But I'll
leave this to the boost developers.
On 3 October 2013 21:25, Sebastian Redl <sebastian.redl_at_[hidden]>wrote:
> On Oct 1, 2013, at 10:22, Bo Peng wrote:
> > I have a Windows DLL, which uses boost::asio::deadline_timer. I found
> > deadline_timer::async_wait creates a timer thread as a private member of
> > io_service. This thread won't be shut down even if all the timers are
> > cancelled. In the destructor of io_service, 'join' will be called on the
> > thread. In some exceptional situation, users might exit their main
> > before destructs the io_service inside my DLL, so the destructor is
> > during the unloading of the DLL, which hangs their process.
> > boost::shared_ptr<Action> action;
> In my opinion, the solution here is to not destroy this object
> automatically on unload. Turn it into a raw pointer. In the exceptional
> situation, you'll leak the object and the I/O service and the thread, but
> since the user is about to exit the main function (at least from your
> description), the process will terminate anyway.
> You could add a line to DllMain's PROCESS_DETACH that checks whether the
> pointer is non-null and prints a warning message to the debug log if you
> want the user to have a chance to know about this happening.
> Unsubscribe & other changes:
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk