Блок NetServerEnum, когда поток завершается извне

(Работа в Win32 API, в среде C с VS2010)

У меня есть приложение с двумя потоками. Первый поток разветвляется на второй и ждет заданный интервал - "TIMEOUT", а затем вызывает TerminateThread() в теме. Между тем, второй поток вызывает NetServerEnum(),

Похоже, что по истечении времени ожидания NetServerEnum возвращен успешно или нет, первый поток заблокирован. Я уже заметил, что NetServerEnum создает собственные рабочие потоки.

В конечном итоге я попадаю в тупик, обычно на ntdll.dll!RtlInitializeExceptionChainне может выйти из моего процесса изящно.

1 ответ

Как это слишком долго для комментария:

Дословно из MSDN, позвольте мне использовать форму ответа (выделено мной):

TerminateThread - опасная функция, которую следует использовать только в самых крайних случаях. Вы должны вызывать TerminateThread только в том случае, если вы точно знаете, что делает целевой поток, и вы контролируете весь код, который, возможно, целевой поток мог выполнять во время завершения. Например, TerminateThread может привести к следующим проблемам:

  • Если целевой поток владеет критическим разделом, критический раздел не будет освобожден.
  • Если целевой поток выделяет память из кучи, блокировка кучи не будет снята. * Если целевой поток выполняет определенные вызовы kernel32 после его завершения, состояние kernel32 для процесса потока может быть несовместимым.
  • Если целевой поток манипулирует глобальным состоянием общей библиотеки DLL, состояние библиотеки DLL может быть уничтожено, что повлияет на других пользователей библиотеки DLL.

Прочитав это, легко понять, почему плохая идея отменить (завершить) поток, застрявший в системном вызове.


Возможный альтернативный подход к дизайну OP может заключаться в порождении потока, вызывающего NetServerEnum() и просто дайте ему поработать, пока не вернется системный вызов.

В то же время основной поток может выполнять другие действия, например, информировать пользователя о том, что сканирование сети занимает больше времени, чем ожидалось.

Другие вопросы по тегам