天天看點

03-Qt應用程式關閉程式的時候出現QMutex: destroying locked mutex

一、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。

繼續閱讀