调用TerminateThread时线程实际终止的时间
When is a thread actually terminated when calling TerminateThread?
如果我使用TerminateThread
函数终止Windows上的线程,那么该线程是在函数返回后实际终止还是异步终止?
定义"实际终止"。文档中说,该线程不能再执行任何用户模式的代码,所以很有效:是的,它被终止了,该线程将不再执行任何代码。
如果您在终止后立即对其进行"WaitForSingleObject",我想由于Windows正在进行清理,可能还会有一些轻微的延迟。
顺便说一句:TerminateThread是结束线程最糟糕的方式。尝试使用其他同步方式,例如告诉线程停止的全局变量,或者事件。
终止线程类似于杀死进程,只是在每个线程级别上。事实上,它可以通过在目标线程中引发(不可捕获的)信号来实现。
结果基本上是一样的:您的程序没有处于任何特定的、可预测的状态。你对死线无能为力。程序的控制流通常变得不确定,因此在线程终止的情况下,很难对程序的行为进行推理。
基本上,除非你的线程正在做一些非常狭窄、特定和受限的事情(例如,每秒增加一次原子计数器),否则没有一个好的模型来描述终止线程的需要,以及线程终止后程序的状态。
不要这样做。设计你的线程,这样你就可以与它们通信,让它们的入口函数可以返回。设计你的程序,这样你就可以最终加入所有线程,并对所有事情负责。
这是一个同步调用。这并不意味着它一定会很快返回——如果操作系统不得不使用其内核间驱动程序来停止线程,可能会出现一些阻塞(即,它实际上运行在与请求终止的线程不同的内核上)。
在应用程序运行期间从用户代码调用TerminateThread存在问题(与在应用程序/进程终止期间使用它的内核不同),正如其他人明确指出的那样。
我非常努力地在应用程序运行期间,使用TerminateThread或任何其他方式,从不终止线程。应用程序生存期线程和线程池通常不需要任何显式终止,操作系统会在应用程序关闭时销毁它们。
- C++为构建时间获取QDateTime的可靠方法
- 从持续时间构造std::chrono::system_clock::time_point
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- while循环中while循环的时间复杂度是多少
- 使用简单类型列表实现的指数编译时间.为什么
- 我想获取我在C++中创建的每个进程的 PID,并在特定时间后终止每个进程
- 一定时间后强制终止方法
- 调用TerminateThread时线程实际终止的时间
- 如何在特定时间后终止递归函数
- 为什么我的程序终止调用KERNEL32!文件时间到系统时间 ()
- 程序在一段时间后终止"std::bad_alloc"
- 在Windows下,线程的创建和终止需要多长时间
- 在终止/非活动会话上执行简单查询需要几分钟时间
- 如何终止长时间运行的Qt线程
- C++ 系统创建的终止过程&&限制其执行时间
- 线程在一段时间后终止
- 用AJAX请求从客户机终止用c++编写的长时间运行的CGI脚本
- 如何计算 n 个线程和 fork() 的创建和终止时间?
- 程序以信号 25 终止,时间 = 0.06 秒内存 = 3340KB