7

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

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

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

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

4

4 回答 4

15

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

我假设您的意思是您正在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);
于 2012-05-24T12:42:51.567 回答
3

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

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

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

于 2012-05-24T12:27:28.127 回答
3

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

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

于 2012-07-18T08:54:07.850 回答
1

运行良好的线程示例:

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.Start();

于 2018-11-12T17:32:38.283 回答