Qt: QMutex

155 篇文章 26 订阅

QMutex

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:在该模式下,一个线程可以锁住同一互斥量多次,互斥量只有经过相同次的unlock()后才能释放。

QMutex::NonRecursive:在该模式下,一个互斥量只能被锁住一次。

成员函数说明

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

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值