Правильная остановка потока

193
20 февраля 2018, 06:56

Добрый день.
Имеется нативный винапи поток, создаваемый функцией 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'ов). К сожалению производитель железа выдает апи в статусе "как есть" и разреверсить его пока не удалось.

Answer 1

Прерывание потока вызовом TerminateThread переводит ваше приложение в несогласованное состояние. Другими словами, после такого вызова оно должно сразу аварийно завершать работу, может сделав дамп для отладочных целей. Если хочется как-то выкрутиться из подвисшего состояния, то следует вынести проблемный код в отдельный процесс и убивать этот процесс посредством TerminateProcess. Тогда ваше основное приложение сможет продолжать работать.

READ ALSO
Не собирается проект Veyon 4.0.4

Не собирается проект Veyon 4.0.4

При сборке проекта выдает следующую ошибку:

180
Пустой цикл в версии Release

Пустой цикл в версии Release

Использую пустой цикл

161
Почему CMake не находит GTest (Google Test)?

Почему CMake не находит GTest (Google Test)?

Существует готовый проектВ одном из cmake-файлов отрабатывает такая конструкция:

141
Запуск jar файла из консоли

Запуск jar файла из консоли

Программа должна скачивать файлы по HTTP протоколуВходные параметры: l – ссылка на файл

130