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

给定多个线程正在运行,是否存在一种通用/正确的方法来等待它们在退出进程时完成?还是“在这种情况下是否可以定时等待?”

是的,我们尝试向线程发出信号以完成信号,但是可以观察到,在进程退出过程中,其中一些线程趋向于停滞。我们最近进行了讨论,因此决定摆脱“任意等待”:

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是否提供了一些帮助来更好地解决线程挂起的问题,因此我们可以记录原因了吗?

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

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

最佳答案



那是你真正的问题。您需要弄清楚为什么某些线程会停顿,并对其进行修复,以使它们不会停顿,并始终在应有的情况下可靠地退出。 (他们退出的确切时间并不重要,只要他们在合理的时间内退出即可,即在用户厌倦等待并强制退出整个应用程序之前)

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

综上所述:不要因为等待超时或强行终止线程而打扰游戏;能让您得到的只是一个有时在关机时崩溃的应用程序。使用无限期等待,并确保在主线程请求线程之后总是(总是!)退出线程,因为这是实现可靠关闭顺序的唯一方法。

关于c++ - 退出进程时等待线程完成,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35951494/

10-11 22:44
查看更多