Qt:QMutex
0、说明
QMutex类提供了线程间的同步控制。
QMutex的目的是,保护Object、数据结构、代码块,以便每次只有一个线程能访问它(类似Java中的synchronized关键字)。不过更好的情况下是用QMutexLocker来实现互斥,因为这能使加锁、解锁更一致。
例如,有一个在打印两行消息的函数:
int number = 6; void method1() { number *= 5; number /= 4; } void method2() { number *= 3; number /= 2; }
如果这两个函数按顺序执行,那么会发生以下情况:
// method1() number *= 5; // number is now 30 number /= 4; // number is now 7 // method2() number *= 3; // number is now 21 number /= 2; // number is now 10
但是如果这两个方法同时被两个线程调用,那么执行结果可能异常:
// Thread 1 calls method1() number *= 5; // number is now 30 // Thread 2 calls method2(). // // Most likely Thread 1 has been put to sleep by the operating // system to allow Thread 2 to run. number *= 3; // number is now 90 number /= 2; // number is now 45 // Thread 1 finishes executing. number /= 4; // number is now 11, instead of 10
如果我们在其上添加互斥锁,我们就能得到我们想要的结果:
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(); }
加锁后,在任意时间只有一个线程能够修改number,这样最终结果就是正确的。
当我们在线程中调用lock()时,其它线程如果想调用lock()方法就会阻塞,直到第一个lock()的线程调用unlock()释放锁。对于lock(),它的一个非阻塞锁是tryLock()。
非争用情况下,QMutex被优化地非常高效。在非递归的QMutex之上如果没有争用,它也不会释放内存。它的构造与销毁没有任何开销,这意味着可以很好地构造很多QMutex。
1、模块和加载项
Header: | #include <QMutex> |
qmake: | QT += core |
Inherited By: |
2、构造
QMutex(QMutex::RecursionMode mode) |
QMutex() |
3、静态字段
enum | RecursionMode | { Recursive, NonRecursive } | 一个Thread是否可以多次调用lock() |
4、实例方法
返回值类型 |
方法 |
说明 |
bool | isRecursive() | 当该Mutex是recursive时返回true |
void | lock() | 加锁 |
bool | tryLock(int timeout = 0) |
尝试加锁,加锁成功返回true。 如果另一个Thread已经加锁,该方法将会等待timeout ms再尝试。 |
bool | try_lock() | 尝试加锁。等同于tryLock()。 |
bool | try_lock_for(std::chrono::duration<Rep, Period> duration) | |
bool | try_lock_until(std::chrono::time_point<Clock, Duration> timePoint) | |
void | unlock() | 解锁 |