QT 之 QMutexLocker如何安全鎖住全局變量


首先需要注意的是:QMutexLocker這個類是基於QMutex的便利類,這個類不能夠定義   私有成員變量  和  全局變量,只能夠定義局部變量來使用。

使用方法

(1)先定義一個QMutex類的變量

 QMutex   m_mutex;   (可以是私有成員變量,也可以是全局變量)

(2)在定義一個QMutexLocker類的變量(注意:在需要上鎖的地方直接定義即可)

QMutexLocker locker(&mutex);

a=5;//等等需要進行寫的操作

使用注意:  (1)如果需要對一個全局變量區域進行保護,那么QMutex定義的變量就得是全局的!

解鎖原理

QMutexLocker上鎖,解鎖的原理:在該局部變量被創建的時候上鎖,當所在函數運行完畢后該QMutexLocker局部變量在棧
中銷毀掉,根據他自己的機制也就相對應的解鎖了。注意,如果該局部變量在中間被打斷,那么QMutexLocker上的鎖就不
會被解鎖掉,因為該函數沒有被完整的是執行完。QMutexLocker所創建的局部變量也沒有被正確銷毀銷毀,
可能就和QMutexLocker他自己本身的機制不服也就不會解鎖。

例子

操作重點在析構函數中加入讓線程停止部分

thread.h和thread.cpp

#include <QThread>
#include <QDebug>
#include <QMutex>
#include <QMutexLocker>
#include <QWaitCondition>
 
extern int a;
extern QMutex m_mutex;
 
class Thread : public QThread
{
public:
    Thread();
    ~Thread();
 
    void setQuit();
 
protected:
    void run();
 
 
private:
    bool m_quit;
};
#include <thread.h>
 
int a = 6;
QMutex m_mutex;
 
 
Thread::Thread():
    m_quit(false)
{
 
}
 
 
Thread::~Thread()
{
    QMutexLocker m_lock(&m_mutex);
    m_quit = true;
    quit();
    wait();
}
 
 
void Thread::run()
{
    while (!m_quit)
    {
        QMutexLocker m_lock(&m_mutex);
        a *= 5;
        qDebug()<<"thread1: "<<a<<endl;
        a /= 4;
        qDebug()<<"thread2: "<<a<<endl;
          
    }
}

data.h和data.cpp

#include <QThread>
#include <QDebug>
#include <QMutex>
#include <QMutexLocker>
 
extern QMutex m_mutex;
extern int a;
 
 
class Data : public QThread
{
public:
    Data();
    ~Data();
 
    void setQuit();
 
protected:
    void run();
 
private:
 
    bool m_quit;
};
#include <data.h>
 
Data::Data():
    m_quit(false)
{
 
}
 
 
Data::~Data()
{
    QMutexLocker m_lock(&m_mutex);
    m_quit = true;
    
    quit();
    wait();
}
 
 
void Data::run()
{
    while (!m_quit)
    {
        QMutexLocker lock(&m_mutex);
      
        a *= 3;
        qDebug()<<"data1: "<<a<<endl;
        a /= 2;
        qDebug()<<"data2: "<<a<<endl;
    }
 
}

main

    Data*  data=new Data();
    Thread* thread=new Thread();
    data->start();
    thread->start();


結果:

data1: 18

data2: 9

thread1: 45

thread2: 11

data1: 33

data2: 16

thread1: 80

thread2: 20 


https://blog.csdn.net/zhaoyuaiweide/article/details/77991658


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM