一、QMutex的源碼的析構函數源碼如下
QMutex::~QMutex()
{
QMutexData *d = d_ptr.load();
if (isRecursive())
delete static_cast<QRecursiveMutexPrivate *>(d);
} else if (d)
# ifndef QT_LINUX_FUTEX
if (d != dummyLocked() && static_cast<QMutexPrivate *>(d)->possiblyUnlocked.load()&& tryLock())
unlock();
return;
}
# endif
qWarning(“"QMutex: destroying locked mutex"”);
}
}
二、解決此報錯的方法
主要原因就是“析構了一個處于鎖定狀态的鎖mutex”
一般在關閉qt應用程式的時候出現。主要是qt程式退出時候先析構了mutex 然後 才停止線程導緻的。
解決方法:不要在qt應用程式中的 main函數中直接開啟任何線程。應該在UI線程中開啟多線程,比如在mainWindow主視窗的構造函數裡面開啟線程,就不會出現此報錯。
在ui線程中開啟你的線程,程式退出時候不會出現以上報錯的原因是,在UI線程開啟的線程是受qt管理的,在程式退出回收資源的時候,qt程式能正确停止開啟的線程。因而不會出現"QMutex: destroying locked mutex”。而你直接在main函數中開啟的線程,就不會被正确停止,或者說不會在回收資源之前停止。因而造成了析構了還處于鎖定狀态的QMutex。