Qt之QMutex


  • 概述

QMutex 类使得线程之间可序列化,文档中的描述为provides access serialization between threads

它被设计的初衷是用来保护一个对象、数据结构、代码段、使得它们在同一一时刻,只有一个线程有访问权限(这有点跟java中的synchronized关键字类似)。

  • 场景

比如我们有如下的代码片段:

 1 int number = 6;
 2 
 3 void method1()
 4 {
 5     number *= 5;
 6     number /= 4;
 7 }
 8 
 9 void method2()
10 {
11     number *= 3;
12     number /= 2;
13 }

 

假如method1()和method2()不在同一线程中,则nunber就成为临界资源,这个时候,为了保证在同一时刻只有一个线程能够使用number,就可以使用Qmutex,具体代码如下:

 1 QMutex mutex;
 2 int number = 6;
 3 
 4 void method1()
 5 {
 6     mutex.lock();
 7     number *= 5;
 8     number /= 4;
 9     mutex.unlock();
10 }
11 
12 void method2()
13 {
14     mutex.lock();
15     number *= 3;
16     number /= 2;
17     mutex.unlock();
18 }

 

  • 提供的成员变量以及成员方法

public type:

  1. enum RecursionMode{Recursive,NonRecursive}

RecursionMode有两种值,分别是1和0,1表示Recursive 在这个模式下,一个线程可以lock多次相同的互斥量,直到相应数量的unlock被调用才能被解锁;0表示一个线程仅可以锁互斥量一次,不可递归。

public functions:

  1. QMutex(RecursionMode mode = NonRecursive)

构造函数,构造一个新的mutex,这个mutex创建之后处于unlock状态。RecursionMode的默认值为0

  1. bool isRecursive()

如果mutex为递归,则返回true。

  1. void lock()

给mutex加锁,如果mutex被另一个线程加了锁,则阻塞直到另一个线程释放锁。处于0模式时将其递归加锁会造成死锁,如果处于1模式,则可以对其多重加锁。

  1. bool tryLock(int timeout = 0)

试着去给一个互斥量加锁,如果这个互斥量没被锁,则返回true,如果被锁,则等待timeout时间,等待其他线程释放锁,当timeout为负数时,一直等待。

  1. void unlock()

给mutex解锁,给一个未lock的mutex解锁,将有不可预知的结果,尝试去给不同的线程中的mutex解锁,会导致错误。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM