1

在一个循环中启动N个线程并在另一个循环中等待每个线程后,我收到消息“QWaitCondition: Destroyed while threads are still 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();
}

我只是无法弄清楚为什么会这样,而我正在等待每个线程。

4

2 回答 2

0

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

于 2020-12-14T14:15:51.903 回答
0

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

于 2020-12-15T15:56:44.147 回答