线程外部终止时的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()
的线程,并让它运行直到系统调用返回。
同时,主线程可以执行其他操作,例如通知用户扫描网络需要更长时间。