我的 Qt 应用程序面临涉及线程和 QMutex 的问题。我有一个运行循环的 QThread 子类,并且我使用 QMutex 来处理线程同步。但是,我不断在控制台中收到错误消息“QMutex:销毁锁定的互斥体”。
这是我的代码的简化版本:
// mythread.h
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QThread>
class MyThread : public QThread
{
Q_OBJECT
public:
MyThread();
void run();
bool Stop ;
signals:
void NumberChanged(int);
};
#endif // MYTHREAD_H
#include "mythread.h"
#include <QtCore>
#include <QDebug>
MyThread::MyThread() {}
void MyThread::run(){
for(int i = 0; i<10000;i++){
QMutex mutex;
mutex.lock();
if (this->Stop) {break;}
mutex.unlock();
emit NumberChanged(i);
}
}
在上面的代码中,我遇到了“QMutex:销毁锁定的互斥体”错误。我根据网上的建议尝试了不同的方法,但问题仍然存在。
有人可以帮我找出问题并提出解决方案吗?我很感激任何见解或指导。谢谢!
手动锁定和解锁互斥体通常是一个坏主意。如果您通过
if (this->Stop) {break;}
离开循环,则互斥锁将不会被解锁。如果对 lock
和 unlock
的调用之间抛出异常,则互斥锁将不会被解锁。
您应该使用 RAII 锁,而不是手动锁定和解锁。 Qt 提供了
QMutexLocker
来做到这一点:
for(int i = 0; i<10000;i++){
{
QMutexLocker locl(&mutex);
if (this->Stop) {break;}
}
emit NumberChanged(i);
}
QMutexLocker
在构造时获取互斥锁上的锁,并在销毁互斥锁时释放互斥锁(也称为解锁它)。