终止正在运行的线程
Kill a running thread
如果我们强行杀死正在运行的线程会发生什么
我有一个线程,即RecordThread()
,它调用了一些复杂且耗时的函数。在这些函数中,我使用 try-catch 块、分配和释放内存以及使用关键部分变量等。
喜欢
void RecordThread()
{
AddRecord();
FindRecord();
DeleteRecord();
// ...
ExitThread(0);
}
创建此线程后,我会在线程完成执行之前立即杀死它。在这种情况下,如果线程被强制杀死会发生什么?内部函数(AddRecord
,DeleteRecord
)在我们杀死线程后是否完成了它们的执行?
创建此线程后,我会在线程完成执行之前立即杀死它。
我假设你的意思是你以以下方式使用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。开始();
- 为什么std::async使用同一个线程运行函数
- 如何在 qt 中从另一个线程运行 qt并发时关闭程序
- 如何使线程运行现有类的函数?C++
- 使用 4 个和 8 个线程运行时执行的时间相等
- 在我调用join()之前,std ::线程运行
- winsock连接调用崩溃如果多个线程运行,则在一个线程中正常工作
- 如何确保这部分代码仅由一个线程运行(在 openmp 中)
- 线程连接在另一个线程运行时会导致分段错误
- 动态提升线程运行存储在具有共享指针的向量中的对象的方法
- 如何启动一个 boost::线程运行一个成员函数
- 如果由另一个 OpenMP 程序调用,则外部调用的 OpenMP 程序仅使用一个线程运行
- 线程运行时间最少
- 计算线程运行的次数
- MySQL C API:从不同线程运行查询时出现分段错误
- 使用两个线程运行和中断一个无限循环
- 与icc 14一起使用多线程运行时库时的错误
- 为什么我得到无限循环只有线程# 0后,所有5个线程运行多线程c++用餐哲学家谜语
- 发布配置上的Visual Studio c++多线程运行时问题
- 使用逻辑线程运行程序
- 为什么设置 CPU 关联会使线程运行速度变慢