deadlock в _initptd и _endthreadex
От: Sergey Larionov США  
Дата: 20.03.08 08:53
Оценка:
Программа обрабатывает поступающую к ней очередь задач, создаёт на каждую задачу по два три потока.
Всё собираю с /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);
}


В чём может быть дело? Из-за чего потоки могут не закрываться?
--
"To get the brain out was an easy part.
The hard part was to get the brain OUT"
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.