线程从外部终止时的NetServerEnum块

时间:2013-06-05 21:26:19

标签: c multithreading winapi netapi32

(使用VS2010在C环境中使用Win32 api)

我有一个双线程应用程序。第一个线程分叉第二个线程并等待给定的间隔 - “TIMEOUT”,然后在其上调用TerminateThread()。 同时,第二个线程调用NetServerEnum()

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

我最终以死锁中的一个线程结束,通常在ntdll.dll!RtlInitializeExceptionChain上,无法正常退出我的进程。

1 个答案:

答案 0 :(得分:0)

由于评论时间过长:

MSDN逐字逐句,允许我使用te答案表格(由我强调):

  

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

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

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


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

同时主线程可以执行其他操作,例如通知用户扫描网络需要的时间更长。