QReadWriteLock 類

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 ()

詳細描述

讀/寫鎖是用於保護可供讀/寫訪問的資源的同步工具。這種類型的鎖很有用,若希望允許多個綫程同時進行隻讀訪問,但一旦某一綫程想要寫入資源就必須阻塞所有其它綫程,直到寫入完成。

在很多情況下,QReadWriteLock 的直接競爭者是 QMutex 。QReadWriteLock 是不錯選擇,若有很多並發讀取但不經常齣現寫入。

範例:

QReadWriteLock lock;
void ReaderThread::run()
{
    ...
    lock.lockForRead();
    read_file();
    lock.unlock();
    ...
}
void WriterThread::run()
{
    ...
    lock.lockForWrite();
    write_file();
    lock.unlock();
    ...
}
					

為確保讀取器不永遠阻塞寫入器,試圖獲取鎖的讀取器不會成功若存在等待訪問的阻塞寫入器,即使目前隻有其它讀取器在訪問鎖。此外,若寫入器在訪問鎖,而另一寫入器進入,則該寫入器將優先於可能也在等待的任何讀取器。

QMutex , a QReadWriteLock can be recursively locked by the same thread when constructed with QReadWriteLock::Recursive as QReadWriteLock::RecursionMode 。在這種情況下, unlock () 必須調用相同次數如 lockForWrite () 或 lockForRead () 的調用。注意,無法改變鎖類型當試著遞歸鎖定時,即:在已鎖定寫入的綫程中鎖定讀取是不可能的 (反之亦然)。

另請參閱 QReadLocker , QWriteLocker , QMutex ,和 QSemaphore .

成員類型文檔編製

enum QReadWriteLock:: RecursionMode

常量 描述
QReadWriteLock::Recursive 1 在此模式下,綫程可以鎖定同一 QReadWriteLock 多次。 QReadWriteLock 不會被解鎖,直到相應次數的 unlock () 調用已做齣。
QReadWriteLock::NonRecursive 0 在此模式下,綫程隻能鎖定 QReadWriteLock 一次。

該枚舉在 Qt 4.4 引入或被修改。

另請參閱 QReadWriteLock ().

成員函數文檔編製

QReadWriteLock:: QReadWriteLock ( QReadWriteLock::RecursionMode recursionMode = NonRecursive)

Constructs a QReadWriteLock object in the given recursionMode .

默認遞歸模式為 NonRecursive .

該函數在 Qt 4.4 引入。

另請參閱 lockForRead (), lockForWrite (),和 RecursionMode .

QReadWriteLock:: ~QReadWriteLock ()

銷毀 QReadWriteLock 對象。

警告: 銷毀使用中的讀/寫鎖可能導緻未定義行為。

void QReadWriteLock:: lockForRead ()

鎖定讀取的鎖。此函數將阻塞當前綫程,若另一綫程已鎖定寫入。

鎖定讀取是不可能的,若綫程已鎖定寫入。

另請參閱 unlock (), lockForWrite (),和 tryLockForRead ().

void QReadWriteLock:: lockForWrite ()

鎖定寫入的鎖。此函數將阻塞當前綫程,若另一綫程 (包括當前綫程) 已鎖定讀取或寫入 (除非鎖的創建是使用 QReadWriteLock::Recursive 模式)。

鎖定寫入是不可能的,若綫程已鎖定讀取。

另請參閱 unlock (), lockForRead (),和 tryLockForWrite ().

bool QReadWriteLock:: tryLockForRead ()

試圖鎖定讀取。若獲得鎖,此函數返迴 true ,否則返迴 false 而不是等待鎖變為可用,即:它不阻塞。

鎖定嘗試將失敗,若另一綫程已鎖定寫入。

若獲得鎖,鎖必須被解鎖采用 unlock () 在另一綫程可以成功鎖定寫入之前。

鎖定讀取是不可能的,若綫程已鎖定寫入。

另請參閱 unlock () 和 lockForRead ().

bool QReadWriteLock:: tryLockForRead ( int timeout )

這是重載函數。

試圖鎖定讀取。此函數返迴 true 若獲得鎖;否則返迴 false 。若另一綫程已鎖定寫入,此函數將最多等待 timeout 毫秒為鎖變為可用。

注意:傳遞負數作為 timeout 相當於調用 lockForRead (),即,此函數將永遠等待直到鎖可以鎖定讀取為此當 timeout 為負。

若獲得鎖,鎖必須被解鎖采用 unlock () 在另一綫程可以成功鎖定寫入之前。

鎖定讀取是不可能的,若綫程已鎖定寫入。

另請參閱 unlock () 和 lockForRead ().

bool QReadWriteLock:: tryLockForWrite ()

試圖鎖定寫入。若獲得鎖,此函數返迴 true ;否則,它返迴 false 立即。

鎖定嘗試將失敗,若另一綫程已鎖定讀取或寫入。

若獲得鎖,鎖必須被解鎖采用 unlock () 在另一綫程可以成功鎖定它之前。

鎖定寫入是不可能的,若綫程已鎖定讀取。

另請參閱 unlock () 和 lockForWrite ().

bool QReadWriteLock:: tryLockForWrite ( int timeout )

這是重載函數。

試圖鎖定寫入。此函數返迴 true 若獲得鎖;否則返迴 false 。若另一綫程已鎖定讀取 (或寫入),此函數將最多等待 timeout 毫秒為鎖變為可用。

注意:傳遞負數作為 timeout 相當於調用 lockForWrite (),即,此函數將永遠等待直到鎖可以鎖定寫入為此當 timeout 為負。

若獲得鎖,鎖必須被解鎖采用 unlock () 在另一綫程可以成功鎖定它之前。

鎖定寫入是不可能的,若綫程已鎖定讀取。

另請參閱 unlock () 和 lockForWrite ().

void QReadWriteLock:: unlock ()

解鎖鎖。

試圖解鎖未鎖定的鎖是錯誤的,並將導緻程序終止。

另請參閱 lockForRead (), lockForWrite (), tryLockForRead (),和 tryLockForWrite ().