终止正在运行的线程

Kill a running thread

本文关键字:线程 运行 终止      更新时间:2023-10-16

如果我们强行杀死正在运行的线程会发生什么

我有一个线程,即RecordThread(),它调用了一些复杂且耗时的函数。在这些函数中,我使用 try-catch 块、分配和释放内存以及使用关键部分变量等。

喜欢

  void RecordThread()
  {
    AddRecord();
    FindRecord();
    DeleteRecord();
    // ...
    ExitThread(0);
   } 

创建此线程后,我会在线程完成执行之前立即杀死它。在这种情况下,如果线程被强制杀死会发生什么?内部函数(AddRecordDeleteRecord)在我们杀死线程后是否完成了它们的执行?

创建此线程后,我会在线程完成执行之前立即杀死它。

我假设你的意思是你以以下方式使用TerminateThread()

HANDLE thread = CreateThread(...);
// ...
// short pause or other action?
// ...
TerminateThread(thread, 0); // Dangerous source of errors!
CloseHandle(thread);

如果是这种情况,那么不,执行RecordThread()的线程将在另一个线程调用TerminateThread()时的位置停止。 根据TerminateThread()文档中的注释,这个确切的点有点随机,取决于您无法控制的复杂计时问题。 这意味着您无法在线程内处理适当的清理,因此,您应该很少(如果有的话)杀死线程。

请求线程完成的正确方法是使用如下所示WaitForSingleObject()

HANDLE thread = CreateThread(...);
// ...
// some other action?
// ...
// you can pass a short timeout instead and kill the thread if it hasn't
// completed when the timeout expires.
WaitForSingleObject(thread, INFINITE);
CloseHandle(thread);

http://msdn.microsoft.com/en-us/library/windows/desktop/ms682659%28v=vs.85%29.aspx

ExitThread 是退出 C 代码中线程的首选方法。但是,在C++代码中,线程在可以调用任何析构函数或可以执行任何其他自动清理之前退出。因此,在C++代码中,应从线程函数返回。

但是,函数调用当然会完成,因为它们是在 ExitThread() 之前调用的。

杀死线程是最后的手段 - 正如 Andre 所说,它使数据处于未知状态,如果线程在共享对象上工作,则永远不应该这样做。更好的选择是通过以下方式通知线程完成工作:

-使用全局易失性(重要)变量,该变量仅由主线程更改并由工人
测试-使用信号类型同步对象(主要是事件)也由主线程设置并由工人测试

运行良好的线程示例:

definition in *.h ------------------------------------
DWORD WINAPI Th_EspectroIF(LPVOID lpData);
CThread th_espectro(Th_EspectroIF);
use in *.cc -----------------------------------
DWORD WINAPI Th_EspectroIF(LPVOID lpData)
{
//Your code...
th_espectro.Stop(true);//stop this Thread 
}

调用线程: th_espectro。开始();