1

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

我有一个两线程应用程序。第一个线程分叉第二个线程并等待给定的时间间隔 - 'TIMEOUT',然后调用TerminateThread()它。同时,第二个线程调用NetServerEnum().

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

我最终导致其中一个线程陷入死锁,通常是 on ntdll.dll!RtlInitializeExceptionChain,无法优雅地退出我的进程。

4

1 回答 1

0

因为这对评论来说太长了:

来自MSDN的逐字记录,请允许我使用答案形式(我强调):

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

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

通过阅读本文很容易理解为什么取消(终止)卡在系统调用中的线程是一个坏主意。


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

与此同时,主线程可以做其他事情,例如通知用户扫描网络需要更长的时间。

于 2013-06-12T17:01:22.027 回答