|
Boost : |
Subject: Re: [boost] [ASIO] Safely shut down timer thread in boost::asio::io_service in Windows DLL
From: Sebastian Redl (sebastian.redl_at_[hidden])
Date: 2013-10-03 07:25:20
On Oct 1, 2013, at 10:22, Bo Peng wrote:
>
> I have a Windows DLL, which uses boost::asio::deadline_timer. I found that
> 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 function
> before destructs the io_service inside my DLL, so the destructor is called
> 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.
Sebastian
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk