Qt QMutex使用詳解


 QMutex類提供的是線程之間的訪問順序化。QMutex的目的是保護一個對象、數據結構或者代碼段,所以同一時間只有一個線程可以訪問它。

      例如,這里有一個方法打印給用戶兩條消息:

1 void DebugInfo() 2 { 3      qDebug("ABC"); 4      qDebug("DEF"); 5 }

如果同時在兩個線程中調用這個方法,結果的順序將是:

ABC ABC DEF DEF

如果你使用了一個互斥量:

1 QMutex mutex; 2  
3 void DebugInfo() 4 { 5      mutex.lock(); 6      qDebug("ABC"); 7      qDebug("DEF"); 8  mutex.unlock(); 9 }

  然后同一時間只有一個線程可以運行DebugInfo()並且消息的順序也一直是正確的。當然,這只是一個很簡單的例子,但是它適用於任何需要按特定頻率發生的情況。
  但你在一個線程中調用lock(),其它線程將會在同一地點試圖調用lock()來阻塞,知道這個線程調用unlock()之后其它線程才會獲得這個鎖。lock()的一種非阻塞選擇是tryLock()。
成員函數:

QMutex::QMutex ( bool recursive = FALSE )

構造一個新的互斥量。這個互斥量是在沒有鎖定的狀態下創建的。如果recursive為真,就構造一個遞歸互斥量,如果recursive為假(默認值),就構造一個普通互斥量。對於一個遞歸互斥量,一個線程可以鎖定一個互斥量多次並且只有在相同數量的unlock()調用之后,它才會被解鎖。

QMutex::~QMutex () 

銷毀這個互斥量。

void QMutex::lock ()

試圖鎖定互斥量。如果另一個線程已經鎖定這個互斥量,那么這次調用將阻塞直到那個線程把它解鎖。
也可以參考unlock()和locked()。

bool QMutex::locked ()

如果互斥量被另一個線程鎖定了,返回真,否則返回假。
警告:由於不同平台上遞歸互斥量的實現不同,所以從以前鎖定這個互斥量的同一個線程上調用這個函數可能會返回未定義的結果。
也可以參考lock()和unlock()。

bool QMutex::tryLock ()

試圖鎖定互斥量。如果鎖被得到,這個函數返回真。如果另一個進程已經鎖定了這個互斥量,這個函數返回假,而不是一直等到這個鎖可用為止,比如,它不是阻塞的。
在另一個線程可以成功鎖定它之前,這個鎖必須被調用unlock()來解鎖。
也可以參考lock()、unlock()和locked()。

void QMutex::unlock ()

解鎖這個互斥量。試圖對不同的線程中鎖定的互斥量進行解鎖將會返回一個錯誤。對一個沒有鎖定的互斥量進行解鎖的結果是將導致未定義的行為(不同的操作系統的線程實現是有很大不同的)。
也可以參考lock()和locked()。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM