Программа обрабатывает поступающую к ней очередь задач, создаёт на каждую задачу по два три потока.
Всё собираю с /MDd, единственная либа что использует msvcrtd.dll — curllibd.dll, который загружает ws_2.dll, а сокеты — msvcrtd.dll.
В тестовом прогоне, что описан ниже curl специально не использовался.
После непродолжительной нагрузки все дедлочится, список потоков выглядит так:
3176 _initptd _getch_nolock Normal 0
3856 _threadstartex boost::thread::sleep Normal 0
2864 _threadstartex _initptd Normal 0
3156 _threadstartex _initptd Normal 0
> 1524 _threadstartex _endthreadex Normal 0
2704 _threadstartex _endthreadex Normal 0
368 _threadstartex _endthreadex Normal 0
3000 _threadstartex _initptd Normal 0
3408 _threadstartex _endthreadex Normal 0
1032 _threadstartex _endthreadex Normal 0
1556 _threadstartex _endthreadex Normal 0
3844 _threadstartex TasksQueue::Lock Normal 0
3344 _threadstartex _endthreadex Normal 0
3292 _threadstartex TasksQueue::Lock Normal 0
200 _threadstartex _endthreadex Normal 0
3672 _threadstartex TasksQueue::Lock Normal 0
216 _threadstartex _endthreadex Normal 0
Call stack для 1524:
ntdll.dll!KiFastSystemCallRet()
[Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll]
ntdll.dll!NtWaitForSingleObject() + 0xc bytes
ntdll.dll!RtlLockHeap() + 0x25c bytes
ntdll.dll!LdrShutdownThread() + 0x32 bytes
kernel32.dll!ExitThread() + 0x2f bytes
> msvcr80d.dll!_endthreadex(unsigned int retcode=0x00000000) Line 414 C
msvcr80d.dll!_callthreadstartex() Line 348 + 0x15 bytes C
msvcr80d.dll!_threadstartex(void * ptd=0x01046090) Line 331 C
kernel32.dll!GetModuleHandleA() + 0xdf bytes
Загружаемые модули:
ModLoad: 00400000 00609000 pro_service.exe
ModLoad: 7c800000 7c8c0000 ntdll.dll
ModLoad: 77e40000 77f42000 C:\WINDOWS\system32\kernel32.dll
ModLoad: 10000000 10040000 C:\WORK\xxxxxx\HEAD\xxxxxx\debug\curllibd.dll
ModLoad: 71c00000 71c17000 C:\WINDOWS\system32\WS2_32.dll
ModLoad: 77ba0000 77bfa000 C:\WINDOWS\system32\msvcrt.dll
ModLoad: 71bf0000 71bf8000 C:\WINDOWS\system32\WS2HELP.dll
ModLoad: 77f50000 77feb000 C:\WINDOWS\system32\ADVAPI32.dll
ModLoad: 77c50000 77cef000 C:\WINDOWS\system32\RPCRT4.dll
ModLoad: 76f50000 76f63000 C:\WINDOWS\system32\Secur32.dll
ModLoad: 76aa0000 76acd000 C:\WINDOWS\system32\WINMM.dll
ModLoad: 77380000 77411000 C:\WINDOWS\system32\USER32.dll
ModLoad: 77c00000 77c48000 C:\WINDOWS\system32\GDI32.dll
ModLoad: 10200000 10320000 C:\WINDOWS\WinSxS\x86_Microsoft.VC80.DebugCRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_F75EB16C\MSVCR80D.dll
ModLoad: 00610000 006fa000 C:\WORK\xxxxxx\HEAD\xxxxxx\debug\tagd.dll
ModLoad: 10480000 1057c000 C:\WINDOWS\WinSxS\x86_Microsoft.VC80.DebugCRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_F75EB16C\MSVCP80D.dll
ModLoad: 77670000 777a9000 C:\WINDOWS\system32\ole32.dll
Почти все потоки висят на RtlLockHeap, ни один дальше неё не ушёл, в своём коде никакого блокирования найти не могу.
Создаю потоки вот так:
UINT id;
HANDLE h = (HANDLE)_beginthreadex(
NULL,
0,
&_waiting_thread,
(void *) t,
CREATE_SUSPENDED ,
&id );
if(h)
{
ResumeThread(h);
CloseHandle(h);
}
В чём может быть дело? Из-за чего потоки могут не закрываться?