QMutex提供了线程间的顺序访问。
QMutex的目的是保护一个对象、数据结构或者代码段,所以同一时间只有一个线程可以访问它。(类似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().
//Thread1很可能被操作系统强制睡眠,允许Thread2运行
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()之后其它线程才会获得这个锁。lock()的一种非阻塞选择是tryLock()。
请参考: QMutexLocker, QReadWriteLock, QSemaphore, 和 QWaitCondition.
成员变量说明
enum QMutex::RecursionMode
值 说明
QMutex::Recursive 1 在该模式下,一个线程可以锁住同一互斥量多次,互斥量只有经过相同次的unlock()后才能释放。
QMutex::NonRecursive 0 在该模式下,一个互斥量只能被锁住一次。
请参考 QMutex().
成员函数说明
QMutex::QMutex ( RecursionMode mode = NonRecursive )
构造一个新的互斥量。互斥量创建时的初始状态是解锁状态。如果创建时的模式为QMutex::Recursive,一个线程可以锁住同一互斥量多次,直到互斥量只有经过相同次的unlock()后才能释放。互斥量创建时默认为QMutex::NonRecursive。
请参考 lock() 和 unlock().
QMutex::~QMutex ()
销毁一个互斥量
警告:销毁一个处于锁定状态的互斥量将导致不确定的后果
void QMutex::lock ()
锁定互斥量。如果另一个线程已经锁定该互斥量,那么这次调用将阻塞直到那个线程把它解锁。
如果它是递归互斥量,允许同一个线程多次调用该函数锁定该互斥量。如果不是递归互斥量,调用该函数将导致死锁。
请参考 unlock().
bool QMutex::tryLock ()
尝试锁定互斥量。如果获得该互斥量,返回true。如果另外的线程已经锁定该互斥量,那么函数立即返回,返回值为false。
当互斥量被锁定,必须通过unlock()解锁,这样其他的线程才能锁定该互斥量。
如果它是递归互斥量,允许同一个线程多次调用该函数锁定该互斥量。如果不是递归互斥量,调用该函数再次锁定互斥量,函数立即返回,返回值为false。
请参考lock() 和 unlock().
bool QMutex::tryLock ( int timeout )
这是tryLock 重载的函数
尝试锁定互斥量。如果获得互斥量,返回true,否则返回false。如果其他线程锁定该互斥量,该函数将等待该互斥量timeout微秒。
注意:传递一个负数作为时间参数的话,相当于调用lock()函数。
当互斥量被锁定,必须通过unlock()解锁,这样其他的线程才能锁定该互斥量。
如果它是递归互斥量,允许同一个线程多次调用该函数锁定该互斥量。如果不是递归互斥量,调用该函数再次锁定互斥量,函数立即返回,返回值为false。
请参考 lock() 和 unlock().
void QMutex::unlock ()
释放互斥量。如果在不是持有该互斥量的线程中调用unlock(),将导致一个错误。
释放一个未被锁定的互斥量将导致一个不确定的后果。
请参考 lock().