Re: deadlock в _initptd и _endthreadex
От: Sergey Larionov США  
Дата: 20.03.08 09:26
Оценка:
Здравствуйте, Sergey Larionov, Вы писали:
SL>В чём может быть дело? Из-за чего потоки могут не закрываться?

Кстати, у меня в потоки передаются хендлы процессов, пайпов и евентов.
я делаю это так:
THREAD_PARAMS *param = new THREAD_PARAMS 
param->ev_terminate = CreateEvent( 
    NULL,         // default security attributes
    FALSE,         // manual-reset event
    FALSE,         // initial state is signaled
    (boost::wformat(L"terminate_pinger_%1%")%t->process_id).str().c_str()  // object name
); 

param->hPipeRd = hChildStdoutRdDup;
param->hPipeWr = hChildStdinWrDup;
DuplicateHandle( GetCurrentProcess (), param->ev_terminate, GetCurrentProcess() ,&(t->ev_terminate), 0, false, DUPLICATE_SAME_ACCESS);
DuplicateHandle( GetCurrentProcess (), param->hPipeRd, GetCurrentProcess() ,&(t->rd), 0, false, DUPLICATE_SAME_ACCESS);
DuplicateHandle( GetCurrentProcess (), param->hPipeWr, GetCurrentProcess() ,&(t->wr), 0, false, DUPLICATE_SAME_ACCESS);

hThread = (HANDLE)_beginthreadex(
    NULL, 
    0, 
    &convertor_listener, 
    (void *) param, 
    0, 
&dwThreadId );


Затем в потоке они закрываются
UINT  __stdcall convertor_listener(void *lpvParam)
{
    THREAD_PARAMS *params = (THREAD_PARAMS *)lpvParam;
...
    CloseHandle(params->ev_terminate);
    CloseHandle(params->hPipeRd);
    CloseHandle(params->hPipeWr);
    CloseHandle(params->siStartInfo.hStdInput);
    CloseHandle(params->siStartInfo.hStdOutput);
return 0;
}


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