Добрый день.
Имеется нативный винапи поток, создаваемый функцией CreateThread(..). Поток опрашивает железо и иногда, когда железо глючит, то поток виснет и возникает необходимость его убить. Для убийства потока используется следующий код:
if (thread != NULL && thread != INVALID_HANDLE_VALUE)
{
DWORD dwProcRet = STILL_ACTIVE;
GetExitCodeThread(thread, &dwProcRet);
if (dwProcRet == STILL_ACTIVE && WaitForSingleObject(thread, 1000) != WAIT_OBJECT_0)
{
if (TerminateThread(thread, 0) == 0)
{
return -1;
}
}
}
return 0;
Достаточен ли данный код для убийства потоков?
P.S. TerminateThread опасная функция и я знаю об этом, именно поэтому сам поток не владеет никакими ресурсами (файлы/сокеты и т.д) и не использует синхронизацию с другими потоками (чтобы избежать deadlock'ов). К сожалению производитель железа выдает апи в статусе "как есть" и разреверсить его пока не удалось.
Прерывание потока вызовом TerminateThread
переводит ваше приложение в несогласованное состояние. Другими словами, после такого вызова оно должно сразу аварийно завершать работу, может сделав дамп для отладочных целей. Если хочется как-то выкрутиться из подвисшего состояния, то следует вынести проблемный код в отдельный процесс и убивать этот процесс посредством TerminateProcess
. Тогда ваше основное приложение сможет продолжать работать.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Существует готовый проектВ одном из cmake-файлов отрабатывает такая конструкция:
Программа должна скачивать файлы по HTTP протоколуВходные параметры: l – ссылка на файл