QReadWriteLock 类

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

头: #include <QReadWriteLock>
CMake: find_package(Qt6 COMPONENTS Core REQUIRED)
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 ()
bool tryLockForRead (int timeout )
bool tryLockForWrite ()
bool tryLockForWrite (int 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 ().

成员函数文档编制

QReadWriteLock:: QReadWriteLock ( QReadWriteLock::RecursionMode recursionMode = NonRecursive)

Constructs a QReadWriteLock object in the given recursionMode .

默认递归模式为 NonRecursive .

另请参阅 lockForRead (), lockForWrite (),和 RecursionMode .

QReadWriteLock:: ~QReadWriteLock ()

销毁 QReadWriteLock 对象。

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

void QReadWriteLock:: lockForRead ()

锁定读取的锁。此函数将阻塞当前线程,若另一线程已锁定写入。

锁定读取是不可能的,若线程已锁定写入。

另请参阅 unlock (), lockForWrite (),和 tryLockForRead ().

void QReadWriteLock:: lockForWrite ()

锁定写入的锁。此函数将阻塞当前线程,若另一线程 (包括当前线程) 已锁定读取或写入 (除非锁的创建是使用 QReadWriteLock::Recursive 模式)。

锁定写入是不可能的,若线程已锁定读取。

另请参阅 unlock (), lockForRead (),和 tryLockForWrite ().

bool QReadWriteLock:: tryLockForRead ()

试图锁定读取。若获得锁,此函数返回 true ,否则,返回 false 而不是等待锁变为可用,即:它不阻塞。

锁定尝试将失败,若另一线程已锁定写入。

若获得锁,锁必须被解锁采用 unlock () 在另一线程可以成功锁定写入之前。

锁定读取是不可能的,若线程已锁定写入。

另请参阅 unlock () 和 lockForRead ().

bool QReadWriteLock:: tryLockForRead ( int timeout )

这是重载函数。

试图锁定读取。此函数返回 true 若获得锁;否则,返回 false 。若另一线程已锁定写入,此函数将最多等待 timeout 毫秒为锁变为可用。

注意:传递负数作为 timeout 相当于调用 lockForRead (),即,此函数将永远等待直到锁可以锁定读取为此当 timeout 为负。

若获得锁,锁必须被解锁采用 unlock () 在另一线程可以成功锁定写入之前。

锁定读取是不可能的,若线程已锁定写入。

另请参阅 unlock () 和 lockForRead ().

bool QReadWriteLock:: tryLockForWrite ()

试图锁定写入。若获得锁,此函数返回 true ;否则,它返回 false 立即。

锁定尝试将失败,若另一线程已锁定读取或写入。

若获得锁,锁必须被解锁采用 unlock () 在另一线程可以成功锁定它之前。

锁定写入是不可能的,若线程已锁定读取。

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

bool QReadWriteLock:: tryLockForWrite ( int timeout )

这是重载函数。

试图锁定写入。此函数返回 true 若获得锁;否则,返回 false 。若另一线程已锁定读取 (或写入),此函数将最多等待 timeout 毫秒为锁变为可用。

注意:传递负数作为 timeout 相当于调用 lockForWrite (),即,此函数将永远等待直到锁可以锁定写入为此当 timeout 为负。

若获得锁,锁必须被解锁采用 unlock () 在另一线程可以成功锁定它之前。

锁定写入是不可能的,若线程已锁定读取。

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

void QReadWriteLock:: unlock ()

解锁锁。

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

另请参阅 lockForRead (), lockForWrite (), tryLockForRead (),和 tryLockForWrite ().