QReadWriteLock 类

QReadWriteLock 类提供读写锁定。 更多...

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

注意: 此类的所有函数 thread-safe .

公共类型

enum RecursionMode { Recursive, NonRecursive }

公共函数

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