Opened 11 years ago
Closed 10 years ago
#6654 closed Bugs (invalid)
deadline_timer may makes dll can't be freed
| Reported by: | Owned by: | chris_kohlhoff | |
|---|---|---|---|
| Milestone: | To Be Determined | Component: | asio |
| Version: | Boost 1.49.0 | Severity: | Problem |
| Keywords: | deadline_timer block | Cc: |
Description
When I use boost::asio::deadline_timer in a dll, FreeLibrary will be blocked. When I commented the deadline_timer, things become ok.
I compile my program on Visual Studio 2010(without sp), and Win Xp sp3. dll was built as Debug configuration, using /MDd
below is my code in main():
HMODULE hmod2 = LoadLibraryA("tDll2.dll");
printf("tDll2.dll loaded\n");
for (;;)
{
char cmd[100];
scanf("%s", cmd);
if (strcmp(cmd, "init") == 0)
{
void_func _init = (void_func)GetProcAddress(hmod2, "init");
_init();
printf("init ok\n");
}
else if (strcmp(cmd, "uninit") == 0)
{
void_func _uninit = (void_func)GetProcAddress(hmod2, "uninit");
_uninit();
printf("uninit ok\n");
}
else if (strcmp(cmd, "exit") == 0)
{
FreeLibrary(hmod2);
printf("tFreeLib.dll free\n");
break;
}
}
code of tDll2.cpp in tDll2.dll
boost::asio::io_service client_ioservice;
boost::asio::io_service::work* client_ioservice_virtual_work;
boost::thread* th;
void run()
{
boost::asio::deadline_timer timer(client_ioservice);
boost::system::error_code error;
client_ioservice.run(error);
if (error)
{
printf("error: %d\n", error.value());
}
delete th;
printf("finish\n");
}
TDLL2_API void init(void)
{
client_ioservice_virtual_work = new boost::asio::io_service::work(client_ioservice);
th = new boost::thread(run);
}
TDLL2_API void uninit(void)
{
delete client_ioservice_virtual_work;
}
this statement printf("finish\n"); is successfully executed, the DllMain is also successfully returned, but FreeLibrary(hmod2); blocks.
When I commented this line:
boost::asio::deadline_timer timer(client_ioservice);
things become ok.
Change History (3)
comment:1 by , 11 years ago
comment:2 by , 11 years ago
declare client_ioservice as boost::asio::io_service*, and manually release the io_service* would avoid this problem.
if I declare io_service as a global variable in dll, or wrap it with shared_ptr, then it(the io_service) can't be properly released.
comment:3 by , 10 years ago
| Resolution: | → invalid |
|---|---|
| Status: | new → closed |
To correctly clean up global io_service objects in a DLL, call
boost::asio::detail::win_thread::set_terminate_threads(true)
at some point prior to the FreeLibrary call.

The console input and output:
It blocks on