Ладно, прильнем к первоисточнику
Исходники 4.5.2 (которыми я до недавнего времени пользовался)
C++ (Qt)
int QThread::exec()
{
Q_D(QThread);
d->mutex.lock();
d->data->quitNow = false;
QEventLoop eventLoop;
d->mutex.unlock();
int returnCode = eventLoop.exec();
return returnCode;
}
Да, возможен deadlock как говорит
Akon. Однако в asm (статик сделать все руки не доходят) видно что код другой. Обновляю исходники до 4.7.4
C++ (Qt)
int QThread::exec()
{
Q_D(QThread);
QMutexLocker locker(&d->mutex);
d->data->quitNow = false;
if (d->exited) {
d->exited = false;
return d->returnCode;
}
locker.unlock();
QEventLoop eventLoop;
int returnCode = eventLoop.exec();
locker.relock();
d->exited = false;
d->returnCode = -1;
return returnCode;
}
Теперь соответствует
Итого: было исправлено