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您不是在等待线程,而是在等待任务。 线程一直运行,直到 QApplication 删除全局 QThreadPool 实例。所以问题是 - 你是在泄漏 QApplication 还是正确销毁它?
【讨论】:
【参考方案2】:实际上,在 DLL 中使用 Qt 时,我也收到了同样的警告。在 DLL 的全局对象被销毁之前,Windows 会在应用程序退出时终止所有线程。全局对象析构函数是我删除 QApplication 实例的地方。这会导致不一致,因为 QWaitConditions 仍然认为线程正在等待,而实际上本机线程不再运行,被 Windows 杀死,没有机会进行适当的清理。这就是导致此警告的原因。 即使在 Qt 中,它也是无法修复的。 Windows 没有给我们任何机会来执行任何清理工作,线程就这样消失了。
【讨论】:
以上是关于QtConcurrent::run => QWaitCondition: 在线程仍在等待时被销毁的主要内容,如果未能解决你的问题,请参考以下文章
在 c++11 模式下使用带有仅移动参数的 QtConcurrent::run