The QReadWriteLock 類提供讀/寫鎖定。 更多...
| 頭: | #include <QReadWriteLock> |
注意: 此類的所有函數 綫程安全 .
| enum | RecursionMode { Recursive, NonRecursive } |
| QReadWriteLock () | |
| QReadWriteLock (RecursionMode recursionMode ) | |
| ~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 can be recursively locked by the same thread when constructed in QReadWriteLock::RecursionMode 。在這種情況下, unlock () 必須調用相同次數如 lockForWrite () 或 lockForRead () 的調用。注意,無法改變鎖類型當試著遞歸鎖定時,即:在已鎖定寫入的綫程中鎖定讀取是不可能的 (反之亦然)。
另請參閱 QReadLocker , QWriteLocker , QMutex ,和 QSemaphore .
| 常量 | 值 | 描述 |
|---|---|---|
QReadWriteLock::Recursive
|
1
|
在此模式下,綫程可以鎖定同一 QReadWriteLock multiple times and the mutex won't be unlocked until a corresponding number of unlock () 調用已做齣。 |
QReadWriteLock::NonRecursive
|
0
|
在此模式下,綫程隻能鎖定 QReadWriteLock 一次。 |
該枚舉在 Qt 4.4 引入或被修改。
另請參閱 QReadWriteLock ().
構造 QReadWriteLock object in NonRecursive 模式。
另請參閱 lockForRead () 和 lockForWrite ().
構造 QReadWriteLock 對象以給定 recursionMode .
該函數在 Qt 4.4 引入。
另請參閱 lockForRead (), lockForWrite (),和 RecursionMode .
銷毀 QReadWriteLock 對象。
警告: 銷毀使用中的讀/寫鎖可能導緻未定義行為。
Locks the lock for reading. This function will block the current thread if any thread (including the current) has locked for writing.
另請參閱 unlock (), lockForWrite (),和 tryLockForRead ().
Locks the lock for writing. This function will block the current thread if another thread has locked for reading or writing.
另請參閱 unlock (), lockForRead (),和 tryLockForWrite ().
Attempts to lock for reading. If the lock was obtained, this function returns true, otherwise it returns false instead of waiting for the lock to become available, i.e. it does not block.
鎖定嘗試將失敗,若另一綫程已鎖定寫入。
若獲得鎖,鎖必須被解鎖采用 unlock () 在另一綫程可以成功鎖定它之前。
另請參閱 unlock () 和 lockForRead ().
這是重載函數。
Attempts to lock for reading. This function returns true if the lock was obtained; otherwise it returns false. If another thread has locked for writing, this function will wait for at most timeout 毫秒為鎖變為可用。
注意:傳遞負數作為 timeout 相當於調用 lockForRead (),即,此函數將永遠等待直到鎖可以鎖定讀取為此當 timeout 為負。
若獲得鎖,鎖必須被解鎖采用 unlock () 在另一綫程可以成功鎖定它之前。
另請參閱 unlock () 和 lockForRead ().
Attempts to lock for writing. If the lock was obtained, this function returns true; otherwise, it returns false immediately.
鎖定嘗試將失敗,若另一綫程已鎖定讀取或寫入。
若獲得鎖,鎖必須被解鎖采用 unlock () 在另一綫程可以成功鎖定它之前。
另請參閱 unlock () 和 lockForWrite ().
這是重載函數。
Attempts to lock for writing. This function returns true if the lock was obtained; otherwise it returns false. If another thread has locked for reading or writing, this function will wait for at most timeout 毫秒為鎖變為可用。
注意:傳遞負數作為 timeout 相當於調用 lockForWrite (),即,此函數將永遠等待直到鎖可以鎖定寫入為此當 timeout 為負。
若獲得鎖,鎖必須被解鎖采用 unlock () 在另一綫程可以成功鎖定它之前。
另請參閱 unlock () 和 lockForWrite ().
解鎖鎖。
試圖解鎖未鎖定的鎖是錯誤的,並將導緻程序終止。
另請參閱 lockForRead (), lockForWrite (), tryLockForRead (),和 tryLockForWrite ().