PySide6.QtCore.QReadWriteLock

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类似,当使用Recursive作为RecursionMode构造时,QReadWriteLock可以被同一个线程递归锁定。在这种情况下,必须调用unlock()与调用lockForWrite()lockForRead()相同的次数。请注意,在尝试递归锁定时,锁类型不能更改,即已经锁定为写入的线程不能锁定为读取(反之亦然)。

class RecursionMode

常量

描述

QReadWriteLock.Recursive

在这种模式下,线程可以多次锁定同一个QReadWriteLock。只有在进行了相应次数的unlock()调用后,QReadWriteLock才会被解锁。

QReadWriteLock.NonRecursive

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

另请参阅

QReadWriteLock()

__init__([recursionMode=QReadWriteLock.RecursionMode.NonRecursive])
Parameters:

recursionModeRecursionMode

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

默认的递归模式是 NonRecursive

lockForRead()

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

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

lockForWrite()

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

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

tryLockForRead([timeout={}])
Parameters:

超时QDeadlineTimer

Return type:

布尔

这是一个重载函数。

尝试锁定以进行读取。如果成功获取锁,此函数将返回true;否则返回false。如果另一个线程已锁定以进行写入,此函数将等待直到timeout过期,以便锁变为可用。

如果锁被获取,必须在另一个线程成功锁定它以进行写入之前使用unlock()解锁。

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

另请参阅

unlock() lockForRead()

tryLockForRead(timeout)
Parameters:

timeout – int

Return type:

布尔

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

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

如果锁被获取,必须在另一个线程成功锁定它以进行写入之前使用unlock()解锁。

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

另请参阅

unlock() lockForRead()

tryLockForWrite([timeout={}])
Parameters:

超时QDeadlineTimer

Return type:

布尔

这是一个重载函数。

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

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

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

另请参阅

unlock() lockForWrite()

tryLockForWrite(timeout)
Parameters:

timeout – int

Return type:

布尔

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

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

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

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

另请参阅

unlock() lockForWrite()

unlock()

解锁锁。

尝试解锁一个未锁定的锁是一个错误,将导致程序终止。