Я ищу случайные сбои в старом приложении c ++. Используя sysinternals Process Explorer, я заметил, что приложение теряет дескрипторы, и извлек точную ситуацию, когда программа теряет дескрипторы к очень короткому куску кода.
DWORD WINAPI MyTestThread( void* PThread)
{
_endthreadex(0);
return 0;
}
int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR PParameter, int)
{
for (int i=0;i<10000;i++)
{
unsigned int threadID;
HANDLE hThread= (HANDLE)_beginthreadex( (void*)NULL, (unsigned int)32768, (unsigned int (__stdcall *)(void *))MyTestThread, (void*)NULL, (unsigned int)0, &threadID);
WaitForSingleObject((HANDLE)hThread, 1000);
CloseHandle((HANDLE)hThread);
}
return 0;
}
Моя проблема: я не могу понять, что не так с этим кодом. Он теряет ровно 5 дескрипторов на каждой итерации, но для меня это выглядит нормально.
Забавная вещь: кажется, не потерять ручки на Windows Vista, но я был бы очень удивлен, если это будет ошибка в Windows 7.
[Обновить] Я попытался использовать _beginthread / _endthread и CreateThread / ExitThread вместо этого, эти два тоже теряют 5 дескрипторов, как _beginthreadex.
[2-е обновление] код работает должным образом. Все возвращаемые значения хороши. Это «просто» потеря ручек, как будто завтрашнего дня нет.
[3-е обновление] Большая новая информация Код теряет дескрипторы, только если скомпилирован с / clr! И еще, если я вызову GC :: Collect () на каждой итерации, дескрипторы будут исправлены!
Итак, как мне найти, какие clr-объекты там собираются?