QMutex:销毁 Qt 线程中锁定的互斥体

问题描述 投票:0回答:1

我的 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:销毁锁定的互斥体”错误。我根据网上的建议尝试了不同的方法,但问题仍然存在。

有人可以帮我找出问题并提出解决方案吗?我很感激任何见解或指导。谢谢!

c++ qt
1个回答
0
投票

手动锁定和解锁互斥体通常是一个坏主意。如果您通过

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
在构造时获取互斥锁上的锁,并在销毁互斥锁时释放互斥锁(也称为解锁它)。

© www.soinside.com 2019 - 2024. All rights reserved.