(使用VS2010在C环境中使用Win32 api)
我有一个双线程应用程序。第一个线程分叉第二个线程并等待给定的间隔 - “TIMEOUT”,然后在其上调用TerminateThread()
。
同时,第二个线程调用NetServerEnum()
。
当达到超时时,无论NetServerEnum
是否成功返回,第一个线程都会死锁。
我已经注意到NetServerEnum
创建了自己的工作线程。
我最终以死锁中的一个线程结束,通常在ntdll.dll!RtlInitializeExceptionChain
上,无法正常退出我的进程。
答案 0 :(得分:0)
由于评论时间过长:
从MSDN逐字逐句,允许我使用te答案表格(由我强调):
TerminateThread是一个危险的函数,只能在最极端的情况下使用。只有在确切知道目标线程正在做什么的情况下才应该调用TerminateThread,并且 你 控制目标线程可能正在运行的所有代码在终止时。例如,TerminateThread可能会导致以下问题:
- 如果目标线程拥有临界区,则不会释放临界区。
- 如果目标线程正在从堆中分配内存,则不会释放堆锁。 *如果目标线程在终止时正在执行某些kernel32调用,则线程进程的kernel32状态可能不一致。
- 如果目标线程正在操纵共享DLL的全局状态,则DLL的状态可能会被破坏,从而影响DLL的其他用户。
通过阅读本文,很容易理解为什么取消(终止)系统调用中存在的线程是个坏主意。
OP设计的一种可能的替代方法可能是产生一个调用NetServerEnum()
的线程,并让它运行直到系统调用返回。
同时主线程可以执行其他操作,例如通知用户扫描网络需要的时间更长。