QReadWriteLock 类
QReadWriteLock 类提供读写锁功能。 更多...
头文件 | #include <QReadWriteLock> |
CMake | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake | QT += core |
- 成员列表,包括继承的成员
- QReadWriteLock 是 多线程类 的一部分。
注意:本类中所有函数都是 线程安全 的。
公共类型
enum | RecursionMode { Recursive, NonRecursive } |
公共函数
QReadWriteLock(QReadWriteLock::RecursionMode recursionMode = NonRecursive) | |
~QReadWriteLock() | |
void | lockForRead() |
void | lockForWrite() |
bool | tryLockForRead(int timeout) |
(since 6.6) bool | tryLockForRead(QDeadlineTimer timeout = {}) |
bool | tryLockForWrite(int timeout) |
(since 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 类似,当用 QReadWriteLock::Recursive 构造时,QReadWriteLock 可以递归地由同一线程锁定。在这种情况下,必须调用与 lockForWrite 或 lockForRead 调用相同次数的 unlock()。注意,在尝试递归锁定时不能更改锁的类型,即在一个已经为写入锁定(反之亦然)的线程中不能锁定以进行读取(反之亦然)。
另请参阅 QReadLocker、QWriteLocker、QMutex 和 QSemaphore。
成员类型文档
enum QReadWriteLock::递归模式
常量 | 值 | 说明 |
---|---|---|
QReadWriteLock::Recursive | 1 | 在此模式中,一个线程可以多次锁定相同的 QReadWriteLock。只有在调用了相同次数的 unlock() 后,QReadWriteLock 才会解锁。 |
QReadWriteLock::NonRecursive | 0 | 在此模式中,一个线程只能锁定一次 QReadWriteLock。 |
另请参阅 QReadWriteLock。
成员函数文档
[显式构造函数]
QReadWriteLock::QReadWriteLock(QReadWriteLock::递归模式 递归模式 = NonRecursive)
在给定的 递归模式 中构造 QReadWriteLock 对象。
默认递归模式是 NonRecursive。
另请参阅 lockForRead、lockForWrite 和 递归模式。
[异常不抛出]
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。
[自 6.6 版开始]
bool QReadWriteLock::tryLockForRead(QDeadlineTimer timeout = {})
这是一个重载的函数。
尝试以读取方式锁定。如果成功获取锁,则此函数返回true
,否则返回false
。如果另一个线程已以写入方式锁定,则此函数将等待,直到超时时间到期才能获取锁。
如果获得了锁,则必须在其他线程可以成功对其进行写锁之前,使用 unlock() 对其进行解锁。
如果线程已经对锁进行了写锁,则无法对其进行读锁。
此函数在Qt 6.6版本中引入。
另请参阅 unlock 和 lockForRead。
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()
解锁。
尝试解锁一个未锁定的锁是一个错误,会导致程序终止。
另请参阅lockForRead,lockForWrite,tryLockForRead,和 tryLockForWrite。
© 2024 Qt公司有限公司。本文件中的文档贡献属其各自所有者的版权。本文件提供的文档受GNU自由文档许可第1.3版条款的许可,由自由软件开发基金会发布。Qt及其相关商标是全球范围内芬兰和/或其他国家的Qt公司有限公司的商标。所有其他商标均为其各自所有者的财产。