The QReadWriteLock 類提供讀/寫鎖定。 更多...
| 頭: | #include <QReadWriteLock> |
| qmake: | QT += core |
注意: 此類的所有函數 綫程安全 .
| enum | RecursionMode { Recursive, NonRecursive } |
| QReadWriteLock (QReadWriteLock::RecursionMode recursionMode = NonRecursive) | |
| ~QReadWriteLock () | |
| void | lockForRead () |
| void | lockForWrite () |
| bool | tryLockForRead () |
| bool | tryLockForRead (int timeout ) |
| bool | tryLockForWrite () |
| bool | tryLockForWrite (int timeout ) |
| void | unlock () |
The QReadWriteLock 類提供讀/寫鎖定。
讀/寫鎖是用於保護可供讀/寫訪問的資源的同步工具。這種類型的鎖很有用,若希望允許多個綫程同時進行隻讀訪問,但一旦某一綫程想要寫入資源就必須阻塞所有其它綫程,直到寫入完成。
在很多情況下, QReadWriteLock 的直接競爭者是 QMutex . QReadWriteLock 是不錯選擇,若有許多並發讀取但不經常發生寫入。
範例:
QReadWriteLock lock; void ReaderThread::run() { ... lock.lockForRead(); read_file(); lock.unlock(); ... } void WriterThread::run() { ... lock.lockForWrite(); write_file(); lock.unlock(); ... }
為確保讀取器不永遠阻塞寫入器,試圖獲取鎖的讀取器不會成功若存在等待訪問的阻塞寫入器,即使目前隻有其它讀取器在訪問鎖。此外,若寫入器在訪問鎖,而另一寫入器進入,則該寫入器將優先於可能也在等待的任何讀取器。
像 QMutex , QReadWriteLock 可以被同一綫程遞歸鎖定,當構造采用 QReadWriteLock::Recursive as QReadWriteLock::RecursionMode 。在這種情況下, unlock () 必須調用相同次數如 lockForWrite () 或 lockForRead () 的調用。注意,無法改變鎖類型當試著遞歸鎖定時,即:在已鎖定寫入的綫程中鎖定讀取是不可能的 (反之亦然)。
另請參閱 QReadLocker , QWriteLocker , QMutex ,和 QSemaphore .
| 常量 | 值 | 描述 |
|---|---|---|
QReadWriteLock::Recursive
|
1
|
在此模式下,綫程可以鎖定同一 QReadWriteLock 多次。 QReadWriteLock 不會被解鎖,直到相應次數的 unlock () 調用已做齣。 |
QReadWriteLock::NonRecursive
|
0
|
在此模式下,綫程隻能鎖定 QReadWriteLock 一次。 |
該枚舉在 Qt 4.4 引入或被修改。
另請參閱 QReadWriteLock ().
構造 QReadWriteLock 對象以給定 recursionMode .
默認遞歸模式為 NonRecursive .
該函數在 Qt 4.4 引入。
另請參閱 lockForRead (), lockForWrite (),和 RecursionMode .
銷毀 QReadWriteLock 對象。
警告: 銷毀使用中的讀/寫鎖可能導緻未定義行為。
鎖定讀取的鎖。此函數將阻塞當前綫程,若另一綫程已鎖定寫入。
鎖定讀取是不可能的,若綫程已鎖定寫入。
另請參閱 unlock (), lockForWrite (),和 tryLockForRead ().
鎖定寫入的鎖。此函數將阻塞當前綫程,若另一綫程 (包括當前綫程) 已鎖定讀取或寫入 (除非鎖的創建是使用 QReadWriteLock::Recursive 模式)。
鎖定寫入是不可能的,若綫程已鎖定讀取。
另請參閱 unlock (), lockForRead (),和 tryLockForWrite ().
試圖鎖定讀取。若獲得鎖,此函數返迴
true
,否則返迴
false
而不是等待鎖變為可用,即:它不阻塞。
鎖定嘗試將失敗,若另一綫程已鎖定寫入。
若獲得鎖,鎖必須被解鎖采用 unlock () 在另一綫程可以成功鎖定寫入之前。
鎖定讀取是不可能的,若綫程已鎖定寫入。
另請參閱 unlock () 和 lockForRead ().
這是重載函數。
試圖鎖定讀取。此函數返迴
true
若獲得鎖;否則返迴
false
。若另一綫程已鎖定寫入,此函數將最多等待
timeout
毫秒為鎖變為可用。
注意:傳遞負數作為 timeout 相當於調用 lockForRead (),即,此函數將永遠等待直到鎖可以鎖定讀取為此當 timeout 為負。
若獲得鎖,鎖必須被解鎖采用 unlock () 在另一綫程可以成功鎖定寫入之前。
鎖定讀取是不可能的,若綫程已鎖定寫入。
另請參閱 unlock () 和 lockForRead ().
試圖鎖定寫入。若獲得鎖,此函數返迴
true
;否則,它返迴
false
立即。
鎖定嘗試將失敗,若另一綫程已鎖定讀取或寫入。
若獲得鎖,鎖必須被解鎖采用 unlock () 在另一綫程可以成功鎖定它之前。
鎖定寫入是不可能的,若綫程已鎖定讀取。
另請參閱 unlock () 和 lockForWrite ().
這是重載函數。
試圖鎖定寫入。此函數返迴
true
若獲得鎖;否則返迴
false
。若另一綫程已鎖定讀取 (或寫入),此函數將最多等待
timeout
毫秒為鎖變為可用。
注意:傳遞負數作為 timeout 相當於調用 lockForWrite (),即,此函數將永遠等待直到鎖可以鎖定寫入為此當 timeout 為負。
若獲得鎖,鎖必須被解鎖采用 unlock () 在另一綫程可以成功鎖定它之前。
鎖定寫入是不可能的,若綫程已鎖定讀取。
另請參閱 unlock () 和 lockForWrite ().
解鎖鎖。
試圖解鎖未鎖定的鎖是錯誤的,並將導緻程序終止。
另請參閱 lockForRead (), lockForWrite (), tryLockForRead (),和 tryLockForWrite ().