QtConcurrent::run => QWaitCondition: Уничтожен, пока потоки все еще ожидают

У меня есть сообщение QWaitCondition: Destroyed, пока потоки все еще ожидают после запуска N потоков в цикле и ожидают каждого в другом цикле.

Вот код:

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();
}

Я просто не могу понять, почему это происходит, пока я жду каждого потока.


person Samfaitmal    schedule 08.05.2015    source источник
comment
Просто из чистого любопытства... как вы получили 'int nb_threads = QThread::idealThreadCount(); QFuture‹void› фьючерсы[nb_threads];' вообще компилировать?   -  person Greenflow    schedule 08.05.2015
comment
Понятно... GCC... Я слишком долго использую clang. Обычно запрещается объявлять массивы с динамическими значениями.   -  person Greenflow    schedule 08.05.2015
comment
Использование QtConcurrent::run меня устраивает. Проблема может быть в gpMainLoopMT... чем бы ни была эта функция.   -  person Greenflow    schedule 09.05.2015
comment
У вас есть экземпляр QApplication или QCoreApplication? forum.qt.io/topic/18462/   -  person fassl    schedule 11.05.2015


Ответы (2)


Вы не ждете потоков, вы ждете задач. Потоки продолжают работать до тех пор, пока QApplication не удалит глобальный экземпляр QThreadPool. Итак, вопрос в том, пропускаете ли вы QApplication или правильно его уничтожаете?

person David Faure    schedule 14.12.2020

На самом деле у меня было такое же предупреждение при использовании Qt в DLL. Windows уничтожает все потоки при выходе из приложения до того, как будут уничтожены глобальные объекты DLL. Деструктор глобального объекта — это место, где я удалял экземпляр QApplication. Это приводит к несоответствию, потому что QWaitConditions по-прежнему считает, что поток ожидает, когда на самом деле собственный поток больше не работает, убит Windows без возможности надлежащей очистки. Вот что приводит к этому предупреждению. Это невозможно исправить даже в Qt. Windows не дает нам возможности выполнить какую-либо очистку, потоки просто исчезают.

person David Faure    schedule 15.12.2020