QMutex

来源:互联网 发布:威锋网mac 编辑:程序博客网 时间:2024/06/08 16:45

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().

原创粉丝点击