QReadWriteLock Class

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)
(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 也可以被同一线程递归锁定,当与QReadWriteLock::Recursive 构建为QReadWriteLock::RecursionMode 时。在这种情况下,调用unlock() 的次数必须与调用lockForWrite() 或lockForRead() 的次数相同。请注意,在尝试递归锁定时,锁的类型不能改变,也就是说,不可能在已经锁定写的线程中锁定读(反之亦然)。

另请参见 QReadLocker,QWriteLocker,QMutexQSemaphore

成员类型文档

enum QReadWriteLock::RecursionMode

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

另请参阅 QReadWriteLock() 。

成员函数文档

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

在给定的recursionMode 中构造一个 QReadWriteLock 对象。

默认递归模式为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 。如果另一个线程锁定了写,该函数将等待直到timeout 过期,锁才会可用。

如果获得了锁,则必须先用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 。如果另一个线程锁定了读取或写入,该函数将等待直到timeout 过期,锁才会可用。

如果已获得锁,则必须使用unlock() 解锁,其他线程才能成功锁定该锁。

如果线程已锁定读取,则无法锁定写入。

此函数在 Qt 6.6 中引入。

另请参阅 unlock() 和lockForWrite()。

void QReadWriteLock::unlock()

解锁。

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

另请参阅 lockForRead()、lockForWrite()、tryLockForRead() 和tryLockForWrite()。

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.