QReadWriteLock 類

QReadWriteLock 類提供讀寫鎖定。 更多...

頭: #include <QReadWriteLock>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core

注意: 此類的所有函數 綫程安全 .

公共類型

enum RecursionMode { Recursive, NonRecursive }

公共函數

QReadWriteLock (QReadWriteLock::RecursionMode recursionMode = NonRecursive)
~QReadWriteLock ()
void lockForRead ()
void lockForWrite ()
bool tryLockForRead (int timeout )
(從 6.6 起) bool tryLockForRead (QDeadlineTimer timeout = {})
bool tryLockForWrite (int timeout )
(從 6.6 起) bool tryLockForWrite (QDeadlineTimer 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 一次。

另請參閱 QReadWriteLock ().

成員函數文檔編製

[explicit] QReadWriteLock:: QReadWriteLock ( QReadWriteLock::RecursionMode recursionMode = NonRecursive)

Constructs a QReadWriteLock object in the given recursionMode .

默認遞歸模式為 NonRecursive .

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

[noexcept] QReadWriteLock:: ~QReadWriteLock ()

銷毀 QReadWriteLock 對象。

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

void QReadWriteLock:: lockForRead ()

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

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

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

void QReadWriteLock:: lockForWrite ()

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

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

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

bool QReadWriteLock:: tryLockForRead ( int timeout )

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

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

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

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

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

[since 6.6] bool QReadWriteLock:: tryLockForRead ( QDeadlineTimer timeout = {})

這是重載函數。

試圖鎖定讀取。此函數返迴 true 若獲得鎖;否則返迴 false . If another thread has locked for writing, this function will wait until timeout expires for the lock to become available.

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

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

該函數在 Qt 6.6 引入。

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

bool QReadWriteLock:: tryLockForWrite ( int timeout )

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

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

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

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

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

[since 6.6] bool QReadWriteLock:: tryLockForWrite ( QDeadlineTimer timeout = {})

這是重載函數。

試圖鎖定寫入。此函數返迴 true 若獲得鎖;否則返迴 false . If another thread has locked for reading or writing, this function will wait until timeout expires for the lock to become available.

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

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

該函數在 Qt 6.6 引入。

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

void QReadWriteLock:: unlock ()

解鎖鎖。

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

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