QMutex类提供了使线程之间序列化。
QMutex的目的就是为了保护一个对象,数据结构或者一部分的代码在某个时期只能被唯一的一个线程访问(这点有点类似于Java的同步关键字)。它通常和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();
}
当你调用lock()在线程中,其他的线程如果也在同样的地方调用lock()需要等到这个被锁定的地方被unlock().一个非阻塞解锁方式就是调用tryLock()而不是lock().
QMutex在非竞争线程中被认为是最佳的快速同步的方式。一种非递归的QMutex不会分配内存,如果没有互斥锁的竞争。
而QMutexLocker是用来简化锁定和解锁的另外一个类。