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