1、官方文档:
QMutex类提供线程间的访问序列化。
QMutex的目的是保护一个对象、数据结构或代码片段,
这样每次只有一个线程可以访问它(这类似于Java synchronized关键字)。
通常最好将互斥对象与QMutexLocker一起使用,因为这样可以很容易地确保一致地执行锁定和解锁。
2、官方示例:
QMutex mutex;
int number = 6;
void method1()
{
mutex.lock();
number *= 5;
number /= 4;
mutex.unlock();
}
void method2()
{
mutex.lock();
number *= 3;
number /= 2;
mutex.unlock();
}
3、配合QMutexLocker使用
单独使用QMutex时,每次都需要加锁、解锁,显得不太方便,QMutex配合QMutexLocker使用是比较推荐的方法:
首先需要注意的是:QMutexLocker这个类是基于QMutex的便利类,这个类不能够定义私有成员变量和 全局变量,只能够定义局部变量来使用。
使用方法:
1.先定义一个QMutex类的变量
QMutex mutex; (可以是私有成员变量,也可以是全局变量)
2.在定义一个QMutexLocker类的变量(注意:在需要上锁的地方直接定义即可)
QMutexLocker locker(&mutex);
#include <QMutex>
...
private:
QMutex mutex;
...
QMutex mutex;
int number = 6;
void method1()
{
QMutexLocker locker(&mutex);
number *= 5;
number /= 4;
}
void method2()
{
QMutexLocker locker(&mutex);
number *= 3;
number /= 2;
}
这样,QMutexLocker上锁,解锁的原理:在该局部变量被创建的时候上锁,当所在函数运行完毕后该QMutexLocker局部变量在栈中销毁掉,根据他自己的机制也就相对应的解锁了。注意,如果该局部变量在中间被打断,那么QMutexLocker上的锁就不会被解锁掉,因为该函数没有被完整地执行完。
QMutexLocker还提供了一个成员函数:QMutex * QMutexLocker::mutex () const
返回在QMutexLocker构造函数中被锁定的互斥量(QMutexLocker正在操作的互斥对象)。这对于需要访问互斥锁的代码很有用,比如QWaitCondition::wait()。