QReadWriteLock 类

QReadWriteLock 类提供读写锁功能。 更多...

头文件 #include <QReadWriteLock>
CMakefind_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmakeQT += core

注意:本类中所有函数都是 线程安全 的。

公共类型

enumRecursionMode { Recursive, NonRecursive }

公共函数

QReadWriteLock(QReadWriteLock::RecursionMode recursionMode = NonRecursive)
~QReadWriteLock()
voidlockForRead()
voidlockForWrite()
booltryLockForRead(int timeout)
(since 6.6) booltryLockForRead(QDeadlineTimer timeout = {})
booltryLockForWrite(int timeout)
(since 6.6) booltryLockForWrite(QDeadlineTimer timeout = {})
voidunlock()

详细描述

读写锁是一种同步工具,用于保护既能读取也能写入的资源。当您希望允许多个线程同时进行只读访问,但一旦有线程希望写入资源,则所有其他线程必须被阻塞,直到写入完成时,这种锁非常有用。

在许多情况下,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::Recursive 构造时,QReadWriteLock 可以递归地由同一线程锁定。在这种情况下,必须调用与 lockForWritelockForRead 调用相同次数的 unlock()。注意,在尝试递归锁定时不能更改锁的类型,即在一个已经为写入锁定(反之亦然)的线程中不能锁定以进行读取(反之亦然)。

另请参阅 QReadLockerQWriteLockerQMutexQSemaphore

成员类型文档

enum QReadWriteLock::递归模式

常量说明
QReadWriteLock::Recursive1在此模式中,一个线程可以多次锁定相同的 QReadWriteLock。只有在调用了相同次数的 unlock() 后,QReadWriteLock 才会解锁。
QReadWriteLock::NonRecursive0在此模式中,一个线程只能锁定一次 QReadWriteLock

另请参阅 QReadWriteLock

成员函数文档

[显式构造函数] QReadWriteLock::QReadWriteLock(QReadWriteLock::递归模式 递归模式 = NonRecursive)

在给定的 递归模式 中构造 QReadWriteLock 对象。

默认递归模式是 NonRecursive

另请参阅 lockForReadlockForWrite递归模式

[异常不抛出] QReadWriteLock::~QReadWriteLock()

销毁 QReadWriteLock 对象。

警告 销毁正在使用的读/写锁可能会导致未定义的行为。

void QReadWriteLock::lockForRead()

对锁进行读锁。如果其他线程已对锁进行写锁,则此函数将阻塞当前线程。

如果线程已经对锁进行了写锁,则无法对其进行读锁。

另请参阅 unlocklockForWritetryLockForRead

void QReadWriteLock::lockForWrite()

对锁进行写锁。如果其他线程(包括当前线程)已对锁进行读或写锁(除非使用 QReadWriteLock::Recursive 模式创建该锁),则此函数将阻塞当前线程。

如果线程已经对锁进行了读锁,则无法对其进行写锁。

另请参阅 unlocklockForReadtryLockForWrite

bool QReadWriteLock::tryLockForRead(int timeout)

尝试对锁进行读锁。如果取得了锁,则此函数返回 true;否则返回 false。如果其他线程已对锁进行写锁,则此函数将等待最多 timeout 毫秒,直到锁变为可用。

注意:将负数作为 timeout 的值与调用 lockForRead 相同,即当 timeout 为负时,此函数将无限期等待,直到能够对锁进行读锁。

如果获得了锁,则必须在其他线程可以成功对其进行写锁之前,使用 unlock() 对其进行解锁。

如果线程已经对锁进行了写锁,则无法对其进行读锁。

另请参阅 unlocklockForRead

[自 6.6 版开始] bool QReadWriteLock::tryLockForRead(QDeadlineTimer timeout = {})

这是一个重载的函数。

尝试以读取方式锁定。如果成功获取锁,则此函数返回true,否则返回false。如果另一个线程已以写入方式锁定,则此函数将等待,直到超时时间到期才能获取锁。

如果获得了锁,则必须在其他线程可以成功对其进行写锁之前,使用 unlock() 对其进行解锁。

如果线程已经对锁进行了写锁,则无法对其进行读锁。

此函数在Qt 6.6版本中引入。

另请参阅 unlocklockForRead

bool QReadWriteLock::tryLockForWrite(int timeout)

尝试以写入方式锁定。如果成功获取锁,则此函数返回true,否则返回false。如果另一个线程已以读取或写入方式锁定,此函数将最多等待超时毫秒以获取锁。

注意:将负数作为超时相当于调用lockForWrite(),即当超时为负时,此函数将无限期等待,直到可以以写入方式锁定锁。

如果获取了锁,则必须在另一个线程可以成功锁定它之前使用unlock()来解锁。

如果线程已经对锁进行了读锁,则无法对其进行写锁。

另请参阅unlock() 和 lockForWrite

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

这是一个重载的函数。

尝试以写入方式锁定。如果成功获取锁,则此函数返回true,否则返回false。如果另一个线程已以读取或写入方式锁定,则此函数将等待,直到超时时间到期才能获取锁。

如果获取了锁,则必须在另一个线程可以成功锁定它之前使用unlock()来解锁。

如果线程已经对锁进行了读锁,则无法对其进行写锁。

此函数在Qt 6.6版本中引入。

另请参阅unlock() 和 lockForWrite

void QReadWriteLock::unlock()

解锁。

尝试解锁一个未锁定的锁是一个错误,会导致程序终止。

另请参阅lockForReadlockForWritetryLockForRead,和 tryLockForWrite

© 2024 Qt公司有限公司。本文件中的文档贡献属其各自所有者的版权。本文件提供的文档受GNU自由文档许可第1.3版条款的许可,由自由软件开发基金会发布。Qt及其相关商标是全球范围内芬兰和/或其他国家的Qt公司有限公司的商标。所有其他商标均为其各自所有者的财产。