在VC ++中终止一个线程

时间:2011-06-27 06:47:16

标签: multithreading visual-c++

我使用CreateThread()函数创建了一个VC ++线程,我想知道如何从外部函数终止创建的线程。

e.g。

 HANDLE Handle_Of_Thread_1 = CreateThread( NULL, 0,Thread_no_1, &Data_Of_Thread_1, 0, NULL);

void Thread_no_1
{
}

我的问题是如何终止我从外部函数创建的线程。

3 个答案:

答案 0 :(得分:2)

可以使用TerminateThread功能,但通常应保留用于紧急情况。当你使用它时,线程会在 no 之后自行清理,这很容易使整个进程处于不稳定状态。

大多数情况下,您希望向线程发送某种信号,以告诉它在此过程中正常退出,释放资源等。这可以通过多种方式完成,例如设置定期检查的事件。

答案 1 :(得分:1)

MSDN中记录了一个函数TerminateThread。但是,请注意,这通常是管理线程的一种不好方法。来自MSDN:

  

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

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

通常最好以某种方式用信号通知线程(例如线程偶尔检查的布尔变量bQuitRequested)请求线程退出,然后让线程自行清理并自然退出{{1 }}。调用进程/线程可以使用ExitThread,传递线程句柄。这将阻塞,直到线程自然退出,或者直到超时为止。

答案 2 :(得分:1)

有各种可能性:

1)使用TerminateThread()API。如果线程没有保存其他线程/进程可能/将要求的其他资源的锁,那么很好。请注意,这组线程非常小并且难以准确定义 - 除非您绝对确定它是安全的,否则不要使用此方法(实际上,这意味着“不要使用它”)。

2)如果线程功能是CPU密集型的,则在线程中的某个适当级别轮询“Abort”布尔值,以便终止足够及时,但不会过多地影响其工作(即,可能不是最内层的循环)

3)如果线程通常在某些API上被阻塞,请尝试“早期”满足API条件,以便线程可以运行,从而检测中止布尔值。确切的使用机制取决于特定的阻塞API。

4)仅在应用程序关闭时终止线程,即。当其他一些线程(通常是主GUI线程)调用ExitProcess()时,让操作系统执行此操作。这需要一些设计约束,例如。除了通过比它们更长的结构/机制之外,线程之间没有通信。

RGDS, 马丁