当线程被externaly终止NetServerEnum块(NetServerEnum block

2019-10-18 06:00发布

(在Win32 API的工作,在C环境VS2010)

我有两个线程的应用程序。 第一线程叉第二和等待一个给定的时间间隔- “超时”,然后调用TerminateThread()就可以了。 同时,第二个线程调用NetServerEnum()

看来,在达到超时时,是否NetServerEnum成功与否返回,第一个线程得到陷入僵局。 我已经注意到, NetServerEnum创建它自己的工作线程。

我最终落得与僵局的一个线程,通常在ntdll.dll!RtlInitializeExceptionChain ,无法正常退出我的过程。

Answer 1:

由于这太长了评论:

从逐字MSDN ,请允许我用TE问答形式(由我强调):

TerminateThread是只能在最极端的情况下使用危险的功能。 你应该调用TerminateThread只有当你确切地知道目标线程是干什么的, 控制所有目标线程可能会在终止时运行的代码。 例如,TerminateThread会导致以下问题:

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

从阅读这很容易understanf为什么它是一个糟糕的主意,取消(终止)螺纹stucking在系统调用。


另一种可能的方法来OP的设计可能是产卵断线程调用NetServerEnum()只是让它运行,直到系统调用返回。

这其间,主线程可以做其他事情一样,例如通知扫描网作为预期更长的用户。



文章来源: NetServerEnum block when thread is terminated externaly