c++ - 退出进程时等待线程完成

标签 c++ multithreading qt

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

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

是的,我们尝试向线程发出结束信号,但观察到在进程退出期间,其中一些线程往往会停止。我们最近进行了讨论,决定取消“任意等待”:

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

关于进程退出时线程正确结束的问题可以回答吗?

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

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

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

最佳答案

Yes, we attempt to signal threads to finish but it is observed that during process exit some of them tend to stall.

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

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

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

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

相关文章:

android - 这是在前 Lollipop 设备上获得涟漪效应的正确方法吗?

mysql - QtCreator错误: QMYSQL driver not loaded

c++ - Qt 重启应用程序同时将实例限制为 1

C++ 和 SQLite - 如何执行由用户输入形成的查询?

c# - 如何在托管 C++ 中正确实现带有事件的 C# 接口(interface)

c++ - 在交错的 openGL 顶点缓冲区对象之间复制

c++ - cmake 添加前缀到链接器

PHP pthreads : Fatal error: Class 'Thread' not found

c++ - 有没有一种安全的方法可以让 std::thread 作为类的成员?

qt - 在运行时在多个 .qrc 文件之间切换