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

时间:2016-03-11 23:05:44

标签: c++ multithreading qt

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

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

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

foreach (SPListItem listItem in activeList.Items.Cast<SPListItem>())
{ … }

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

是否可以回答关于在流程退出时正确处理线程的问题?

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

P.S。请注意我Microsoft’s own guidelines强调为什么强行终止线程是错误的,如何做到这一点。我想这个问题不是关于同步,而是关于运行大量我们的框架和操作系统代码的线程的有限确定性。操作系统不是实时,对:Windows / MacOS / Linux等。

P.P.S。所讨论的所有线程都有事件循环,因此响应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

1 个答案:

答案 0 :(得分:2)

  

是的,我们尝试发信号完成但是观察到了   在流程退出期间,其中一些趋于停滞。

这是你真正的问题。你需要弄清楚为什么你的某些线程停滞不前,并修复它们以便它们不会失速并且在它们应该的时候总是可靠地退出。 (他们退出的确切时间并不重要,只要他们在合理的时间内退出,即在用户厌倦等待并强行退出整个申请之前)

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

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