在退出进程时等待线程完成

Waiting on threads to finish while quitting the process

本文关键字:线程 等待 退出 进程      更新时间:2023-10-16

在一个非常简单的问题上没有找到直接和令人满意的答案:

给定多个线程正在运行,是否有一种通用/正确的方法可以在退出进程时等待它们完成?"或者"在这种情况下,做定时等待可以吗?

是的,我们尝试向线程发出完成信号,但观察到在进程退出期间,其中一些线程往往会停止。我们最近进行了一次讨论,决定摆脱"任意等待":

m_thread.quit();          // the way we had threads finished
m_thread.wait(kWaitMs);   // with some significant expiration (~1000ms)
m_thread.quit();          // the way we have threads finished now
m_thread.wait();          // wait forever until finished

我知道 kWaitMs 常量的选择应该与线程完成的一个不间断的"作业周期"成正比。比如说,如果线程处理一些数据块 10 毫秒,那么我们可能应该等待它响应退出信号 100 毫秒,如果它仍然没有退出,那么我们就不再等待了。在这种情况下,只要我们退出程序并且不再关心,我们就不会等待。但一些工程师不理解这种"范式",想要一个最终的等待。请注意,在我们的例子中,卡在客户端计算机内存中的程序进程会导致下一次程序启动时出现问题,更不用说日志将无法正确完成以作为错误进行处理。

可以回答有关工艺退出时正确螺纹精加工的问题吗?

Qt/API 是否有一些帮助可以更好地解决线程挂起问题,以便我们可以记录原因?

附言请注意,我很清楚为什么强制终止线程是错误的以及如何做到这一点。我想这个问题不是关于同步,而是关于运行大量我们的框架和操作系统代码的线程的有限确定性。操作系统不是实时的,对:Windows/MacOS/Linux等。

附言所有有问题的线程都有事件循环,因此它们应该响应QThread::quit()

是的,我们尝试向线程发出完成信号,但观察到 在进程退出期间,其中一些往往会停滞不前。

这才是你真正的问题。 您需要找出某些线程停滞的原因,并修复它们,以便它们不会停止并始终在应该停止时可靠地退出。 (他们退出所需的确切时间并不那么重要,只要他们在合理的时间内退出,即在用户厌倦等待并强制退出整个应用程序之前)

如果您不这样做/不能这样做,则无法可靠地关闭您的应用程序,因为您无法安全地释放线程可能仍在访问的任何资源。 有必要 100% 保证线程在主线程调用线程使用的任何对象的析构函数(例如与线程关联的 QThread 对象)之前退出

总而言之:不要费心玩等待超时或强制终止线程的游戏;所有会让你得到的是一个有时会在关机时崩溃的应用程序。 使用无限期等待,并确保您的线程始终(始终!)在主线程要求它们退出后退出,因为这是实现可靠关闭序列的唯一方法。