如果我使用该函数在 Windows 上终止一个线程TerminateThread
,该线程是在函数返回后实际终止还是终止异步?
3 回答
定义“实际终止”。文档说该线程不能再执行任何用户模式代码,如此有效:是的,它已终止,您的代码将不再由该线程执行。
如果您在终止后立即对其“WaitForSingleObject”,我想由于 Windows 正在进行的清理工作,仍然可能会有一些轻微的延迟。
顺便说一句: TerminateThread 是结束线程的最糟糕的方式。尝试使用其他一些同步方式,例如告诉线程停止的全局变量或事件。
终止一个线程类似于杀死一个进程,只是在每个线程级别上。它实际上可以通过在目标线程中引发(无法捕获的)信号来实现。
结果基本上是一样的:你的程序没有处于任何特定的、可预测的状态。对于死线程,您无能为力。程序的控制流通常变得不确定,因此在线程终止的情况下很难推断程序的行为。
基本上,除非您的线程正在做一些极其狭窄、特定和受限制的事情(例如,每秒增加一次原子计数器),否则对于终止线程的需要以及线程终止后的程序状态没有好的模型。
不要这样做。设计您的线程,以便您可以与它们进行通信,并且它们的入口函数可以返回。设计您的程序,以便您始终可以最终加入所有线程并解决所有问题。
这是一个同步调用。这并不意味着它一定会快速返回 - 如果操作系统必须诉诸于使用其内核间驱动程序来停止线程,则可能会涉及一些阻塞(即,它实际上运行在与请求终止的线程不同的内核上) )。
正如其他人明确发布的那样,在应用程序运行期间从用户代码调用 TerminateThread 存在问题(与在应用程序/进程终止期间使用它的内核不同)。
在应用程序运行期间,我非常努力地从不终止线程,使用 TerminateThread 或任何其他方式。在应用程序关闭时操作系统销毁它们之前,应用程序生命周期线程和线程池通常不需要任何显式终止。