首先需要注意的是:QMutexLocker這個類是基於QMutex的便利類,這個類不能夠定義 私有成員變量 和 全局變量,只能夠定義局部變量來使用。
使用方法:(1)先定義一個QMutex類的變量
QMutex m_mutex; (可以是私有成員變量,也可以是全局變量)
(2) 在定義一個QMutexLocker類的變量(注意:在需要上鎖的地方直接定義即可)
QMutexLocker locker(&mutex);
a = 5; //等等需要進行寫的操作
使用注意: (1)如果需要對一個全局變量區域進行保護,那么QMutex定義的變量就得是全局的!
(2)QMutexLocker上鎖,解鎖的原理:在該局部變量被創建的時候上鎖,當所在函數運行完畢后該QMutexLocker局部變量在棧中銷毀掉,根據他自己的機制也就相對應的解鎖了。注意,如果該局部變量在中間被打斷,那么QMutexLocker上的鎖就不會被解鎖掉,因為該函數沒有被完整的是執行完。QMutexLocker所創建的局部變量也沒有被正確銷毀銷毀,可能就和QMutexLocker他自己本身的機制不服也就不會解鎖。
下面的例子是在兩個線程(thread和data)中分別對一個全局變量進行寫操作(操作重點在析構函數中加入讓線程停止部分):
thread.h #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; }; thread.cpp #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 #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; }; data.cpp #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; } }
https://blog.csdn.net/zhaoyuaiweide/article/details/77991658