QReadWriteLock 类

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

头: #include <QReadWriteLock>
qmake: QT += core

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

公共类型

enum RecursionMode { Recursive, NonRecursive }

公共函数

QReadWriteLock (RecursionMode recursionMode = NonRecursive)
~QReadWriteLock ()
void lockForRead ()
void lockForWrite ()
bool tryLockForRead ()
bool tryLockForRead (int timeout )
bool tryLockForWrite ()
bool tryLockForWrite (int timeout )
void unlock ()

详细描述

The QReadWriteLock 类提供读/写锁定。

读/写锁是用于保护可供读/写访问的资源的同步工具。这种类型的锁很有用,若希望允许多个线程同时进行只读访问,但一旦某一线程想要写入资源就必须阻塞所有其它线程,直到写入完成。

在很多情况下, 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 as QReadWriteLock::RecursionMode 。在这种情况下, unlock () 必须调用相同次数如 lockForWrite () 或 lockForRead () 的调用。注意,无法改变锁类型当试着递归锁定时,即:在已锁定写入的线程中锁定读取是不可能的 (反之亦然)。

另请参阅 QReadLocker , QWriteLocker , QMutex ,和 QSemaphore .

成员类型文档编制

enum QReadWriteLock:: RecursionMode

常量 描述
QReadWriteLock::Recursive 1 在此模式下,线程可以锁定同一 QReadWriteLock 多次。 QReadWriteLock 不会被解锁,直到相应次数的 unlock () 调用已做出。
QReadWriteLock::NonRecursive 0 在此模式下,线程只能锁定 QReadWriteLock 一次。

该枚举在 Qt 4.4 引入或被修改。

另请参阅 QReadWriteLock ().

成员函数文档编制

QReadWriteLock:: QReadWriteLock ( RecursionMode recursionMode = NonRecursive)

构造 QReadWriteLock 对象以给定 recursionMode .

默认递归模式为 NonRecursive .

该函数在 Qt 4.4 引入。

另请参阅 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 ().