(在Win32 API的工作,在C环境VS2010)
我有两个线程的应用程序。 第一线程叉第二和等待一个给定的时间间隔- “超时”,然后调用TerminateThread()
就可以了。 同时,第二个线程调用NetServerEnum()
看来,在达到超时时,是否NetServerEnum
成功与否返回,第一个线程得到陷入僵局。 我已经注意到, NetServerEnum
创建它自己的工作线程。
我最终落得与僵局的一个线程,通常在ntdll.dll!RtlInitializeExceptionChain
,无法正常退出我的过程。
由于这太长了评论:
从逐字MSDN ,请允许我用TE问答形式(由我强调):
TerminateThread是只能在最极端的情况下使用危险的功能。 你应该调用TerminateThread只有当你确切地知道目标线程是干什么的, 你控制所有目标线程可能会在终止时运行的代码。 例如,TerminateThread会导致以下问题:
- 如果目标线程拥有临界区,临界区将不会被释放。
- 如果目标线程是从堆中分配内存,堆锁将不会被释放。 *如果目标线程正在执行某些KERNEL32呼叫时被终止,该线程的过程中,KERNEL32状态可能是不一致的。
- 如果目标线程操作的共享DLL的全局状态,DLL的状态可能会被破坏,影响DLL的其他用户。
从阅读这很容易understanf为什么它是一个糟糕的主意,取消(终止)螺纹stucking在系统调用。
另一种可能的方法来OP的设计可能是产卵断线程调用NetServerEnum()
只是让它运行,直到系统调用返回。
这其间,主线程可以做其他事情一样,例如通知扫描网作为预期更长的用户。