先来看一个代码片段
Test::Test()
{
thread = new QThread;
QObject::connect(thread , &QThread::started,
[&]()
{
while (running) {
mtx.lock(); // QMutex
waiter.wait(&mtx); // QWaitCondition
.....
mtx.unlock();
}
});
thread.start();
}
Test::~Test()
{
running = false;
if (thread.isRunning()) {
waiter.wakeAll();
thread.quit();
thread.wait();
}
}
上面代码当线程一直在运行中
且APP已经退出(即代码已经走到了return app.exec()
)
此时如果系统调用了Class Test
的析构函数
会报错FORTIFY: pthread_mutex_lock called on a destroyed mutex
意思是
通过QWaitCondition
和QMutex
来阻塞线程
在析构函数才退出线程的时候,就会触发这个报错
正确的做法是不直接return app.exec();
如下代码所示:
QGuiApplication app(argc, argv);
......
auto exec = app.exec();
// 此处调用退出子线程代码
......
// 返回exec
return exec