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