线程外部终止时的NetServerEnum块

(使用VS2010在C环境中使用Win32 api)

我有一个双线程的应用程序。 第一个线程分叉第二个线程并等待给定的间隔 – “TIMEOUT”,然后在其上调用TerminateThread() 。 同时,第二个线程调用NetServerEnum()

看来,当达到超时时,无论NetServerEnum是否成功返回,第一个线程都会死锁。 我已经注意到NetServerEnum创建了自己的工作线程。

我最终得到了死锁中的其中一个线程,通常是在ntdll.dll!RtlInitializeExceptionChain ,无法正常退出我的进程。

由于这个评论太久了:

来自MSDN的 Verbatim,允许我使用te答案表格(由我强调):

TerminateThread是一个危险的函数,只能在最极端的情况下使用。 只有当您确切知道目标线程正在执行的操作时,才应调用TerminateThread,并且您可以控制目标线程在终止时可能正在运行的所有代码。 例如,TerminateThread可能会导致以下问题:

  • 如果目标线程拥有临界区,则不会释放临界区。
  • 如果目标线程正在从堆中分配内存,则不会释放堆锁。 *如果目标线程在终止时正在执行某些kernel32调用,则线程进程的kernel32状态可能不一致。
  • 如果目标线程正在操纵共享DLL的全局状态,则DLL的状态可能会被破坏,从而影响DLL的其他用户。

从阅读本文来看,很容易理解为什么取消(终止)系统调用中存在的线程是个坏主意。


OP设计的一种可能的替代方法可能是产生一个调用NetServerEnum()的线程,并让它运行直到系统调用返回。

同时,主线程可以执行其他操作,例如通知用户扫描网络需要更长时间。