- 概述
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:
- enum RecursionMode{Recursive,NonRecursive}
RecursionMode有兩種值,分別是1和0,1表示Recursive 在這個模式下,一個線程可以lock多次相同的互斥量,直到相應數量的unlock被調用才能被解鎖;0表示一個線程僅可以鎖互斥量一次,不可遞歸。
public functions:
- QMutex(RecursionMode mode = NonRecursive)
構造函數,構造一個新的mutex,這個mutex創建之后處於unlock狀態。RecursionMode的默認值為0
- bool isRecursive()
如果mutex為遞歸,則返回true。
- void lock()
給mutex加鎖,如果mutex被另一個線程加了鎖,則阻塞直到另一個線程釋放鎖。處於0模式時將其遞歸加鎖會造成死鎖,如果處於1模式,則可以對其多重加鎖。
- bool tryLock(int timeout = 0)
試着去給一個互斥量加鎖,如果這個互斥量沒被鎖,則返回true,如果被鎖,則等待timeout時間,等待其他線程釋放鎖,當timeout為負數時,一直等待。
- void unlock()
給mutex解鎖,給一個未lock的mutex解鎖,將有不可預知的結果,嘗試去給不同的線程中的mutex解鎖,會導致錯誤。