class QReadWriteLock#

QReadWriteLock提供读写锁。 更多

概述#

方法#

注意

本文档可能包含自动从C++转换为Python的代码片段。我们始终欢迎对代码片段翻译的贡献。如果您发现翻译问题,也可以通过在https:/bugreports.qt.io/projects/PYSIDE创建工单来通知我们。

详细描述#

警告

本部分包含自动从C++转换为Python的代码片段,可能存在错误。

读写锁是一种用于保护可读可写资源的同步工具。这种类型的锁很有用,如果您想允许多个线程同时具有只读访问权限,但如果某个线程想要写入资源,则所有其他线程必须被阻塞,直到写入完成。

在许多情况下,QReadWriteLockQMutex 的直接竞争对手。QReadWriteLock 适用于存在大量并发读操作且写操作不频繁的情况。

示例

lock = QReadWriteLock()
def run(self):

    ...
    lock.lockForRead()
    read_file()
    lock.unlock()
    ...

def run(self):

    ...
    lock.lockForWrite()
    write_file()
    lock.unlock()
    ...

为了确保写者不会被读者永久阻塞,尝试获取锁的读者如果在等待访问时有阻塞的写者,则将无法成功获取锁,即使此时锁只被其他读者访问。此外,如果有写者正在访问锁,并且另一个写者到来,那么该写者将有优先权,即使有其他读者也在等待。

QMutex 类似,QReadWriteLock 可以在构造时使用 Recursive 作为 RecursionMode 递归锁定同一个线程。在这些情况下,必须调用 unlock() 的次数与调用 lockForWrite()lockForRead() 的次数相同。请注意,在尝试递归锁定时,无法更改锁的类型,即在一个已经尝试写入的线程中不能再次尝试只读锁定(反之亦然)。

class RecursionMode#

常量

描述

QReadWriteLock.Recursive

在此模式下,一个线程可以多次锁定相同的 QReadWriteLock。当调用相应数量的 unlock() 方法后,QReadWriteLock 才会被解锁。

QReadWriteLock.NonRecursive

在此模式下,一个线程只能对 QReadWriteLock 锁定一次。

也请参见

QReadWriteLock()

__init__([recursionMode=QReadWriteLock.RecursionMode.NonRecursive])#
参数:

recursionModeRecursionMode

使用指定的 recursionMode 构造一个 QReadWriteLock 对象。

默认的可递归模式是 NonRecursive .

lockForRead()#

对锁定进行读取操作。如果另一个线程已锁定为写入,此函数将阻塞当前线程。

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

lockForWrite()#

对锁定进行写入操作。如果另一个线程(包括当前线程)已锁定为读取或写入(除非使用 Recursive 模式创建锁),则此函数将阻塞当前线程。

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

tryLockForRead([timeout={}])#
参数:

timeoutQDeadlineTimer

返回类型:

bool

这是一个重载函数。

尝试加读锁。如果成功获取锁,则返回 true;否则返回 false。如果另一线程已锁定为写锁,则该函数将等待,直到 timeout 到期,以便获取锁。

如果获取了锁,则必须在另一个线程成功锁定为写锁之前,使用 unlock() 释放锁。

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

也请参见

unlock() lockForRead()

tryLockForRead(timeout)
参数:

timeout – int

返回类型:

bool

尝试加读锁。如果成功获取锁,则返回 true;否则返回 false。如果另一线程已锁定为写锁,则该函数将在最多 timeout 毫秒内等待锁变为可用。

注意:传递负数作为 timeout 等同于调用 lockForRead(),即如果 timeout 为负,则在锁定为读锁时无限期等待。

如果获取了锁,则必须在另一个线程成功锁定为写锁之前,使用 unlock() 释放锁。

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

也请参见

unlock() lockForRead()

tryLockForWrite([timeout={}])#
参数:

timeoutQDeadlineTimer

返回类型:

bool

这是一个重载函数。

尝试加写锁。如果成功获取锁,则返回 true;否则返回 false。如果另一线程已锁定为读或写,则该函数将等待,直到 timeout 到期,以便获取锁。

如果获取了锁,则必须在另一个线程成功锁定之前,使用 unlock() 释放锁。

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

也请参见

unlock() lockForWrite()

tryLockForWrite(timeout)
参数:

timeout – int

返回类型:

bool

尝试进行写入锁定。此函数如果获取了锁定,则返回 true;否则返回 false。如果另一个线程已经进行了读取或写入锁定,此函数将等待最多 timeout 毫秒,直到锁定变为可用。

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

如果获取了锁,则必须在另一个线程成功锁定之前,使用 unlock() 释放锁。

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

也请参见

unlock() lockForWrite()

unlock()#

解锁锁。

尝试解锁未锁定的锁是错误行为,并会导致程序终止。