QtConcurrent::run => QWaitCondition: 在线程仍在等待时被销毁

Posted

技术标签:

【中文标题】QtConcurrent::run => QWaitCondition: 在线程仍在等待时被销毁【英文标题】:QtConcurrent::run => QWaitCondition: Destroyed while threads are still waiting 【发布时间】:2015-05-08 19:30:02 【问题描述】:

在一个循环中启动 N 个线程并在另一个循环中等待每个线程后,我收到消息“QWaitCondition: Destroyed while threads are waiting”。

代码如下:

int nb_threads = QThread::idealThreadCount();
QFuture<void> futures[nb_threads];
bool shared_boolean;
// launch threads
for(int i = 0;i<nb_threads;++i)
    futures[i] = QtConcurrent::run(this,gpMainLoopMT,&shared_boolean,&next_pop_size,next_population);


// wait for threads to finish
for(int i = 0;i<nb_threads;++i)
    futures[i].waitForFinished();

当我在等待每个线程时,我无法弄清楚为什么会发生这种情况。

【问题讨论】:

纯粹出于好奇......你是如何得到 'int nb_threads = QThread::idealThreadCount(); QFuture 期货[nb_threads];'编译? 我明白了... GCC... 我使用 clang 的时间太长了。通常情况下,禁止声明具有动态值的数组。 QtConcurrent::run 的用法对我来说看起来不错。问题可能出在 gpMainLoopMT...不管这个函数是什么。 你有 QApplication 或 QCoreApplication 实例吗? forum.qt.io/topic/18462/… 【参考方案1】:

您不是在等待线程,而是在等待任务。 线程一直运行,直到 QApplication 删除全局 QThreadPool 实例。所以问题是 - 你是在泄漏 QApplication 还是正确销毁它?

【讨论】:

【参考方案2】:

实际上,在 DLL 中使用 Qt 时,我也收到了同样的警告。在 DLL 的全局对象被销毁之前,Windows 会在应用程序退出时终止所有线程。全局对象析构函数是我删除 QApplication 实例的地方。这会导致不一致,因为 QWaitConditions 仍然认为线程正在等待,而实际上本机线程不再运行,被 Windows 杀死,没有机会进行适当的清理。这就是导致此警告的原因。 即使在 Qt 中,它也是无法修复的。 Windows 没有给我们任何机会来执行任何清理工作,线程就这样消失了。

【讨论】:

以上是关于QtConcurrent::run => QWaitCondition: 在线程仍在等待时被销毁的主要内容,如果未能解决你的问题,请参考以下文章

停止由 QtConcurrent::run 启动的线程?

在 c++11 模式下使用带有仅移动参数的 QtConcurrent::run

QtConcurrent 运行的线程 id

QtConcurrent::run 如何停止后台任务

使用 QtConcurrent::run() 修改成员变量?

QtConcurrent::run 发出信号