- class QReadWriteLock#
类
QReadWriteLock提供读写锁。 更多…概述#
方法#
def
__init__()def
lockForRead()def
lockForWrite()def
tryLockForRead()def
unlock()
注意
本文档可能包含自动从C++转换为Python的代码片段。我们始终欢迎对代码片段翻译的贡献。如果您发现翻译问题,也可以通过在https:/bugreports.qt.io/projects/PYSIDE创建工单来通知我们。
详细描述#
警告
本部分包含自动从C++转换为Python的代码片段,可能存在错误。
读写锁是一种用于保护可读可写资源的同步工具。这种类型的锁很有用,如果您想允许多个线程同时具有只读访问权限,但如果某个线程想要写入资源,则所有其他线程必须被阻塞,直到写入完成。
在许多情况下,
QReadWriteLock是QMutex的直接竞争对手。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])#
- 参数:
recursionMode –
RecursionMode
使用指定的
recursionMode构造一个QReadWriteLock对象。默认的可递归模式是
NonRecursive.- lockForRead()#
对锁定进行读取操作。如果另一个线程已锁定为写入,此函数将阻塞当前线程。
如果线程已经锁定为写入,则无法进行读取锁定。
- lockForWrite()#
对锁定进行写入操作。如果另一个线程(包括当前线程)已锁定为读取或写入(除非使用
Recursive模式创建锁),则此函数将阻塞当前线程。如果线程已经锁定为读取,则无法进行写入锁定。
- tryLockForRead([timeout={}])#
- 参数:
timeout –
QDeadlineTimer- 返回类型:
bool
这是一个重载函数。
尝试加读锁。如果成功获取锁,则返回 true;否则返回 false。如果另一线程已锁定为写锁,则该函数将等待,直到 timeout 到期,以便获取锁。
如果获取了锁,则必须在另一个线程成功锁定为写锁之前,使用
unlock()释放锁。如果线程已经锁定为写入,则无法进行读取锁定。
也请参见
- tryLockForRead(timeout)
- 参数:
timeout – int
- 返回类型:
bool
尝试加读锁。如果成功获取锁,则返回 true;否则返回 false。如果另一线程已锁定为写锁,则该函数将在最多 timeout 毫秒内等待锁变为可用。
注意:传递负数作为 timeout 等同于调用
lockForRead(),即如果 timeout 为负,则在锁定为读锁时无限期等待。如果获取了锁,则必须在另一个线程成功锁定为写锁之前,使用
unlock()释放锁。如果线程已经锁定为写入,则无法进行读取锁定。
也请参见
- tryLockForWrite([timeout={}])#
- 参数:
timeout –
QDeadlineTimer- 返回类型:
bool
这是一个重载函数。
尝试加写锁。如果成功获取锁,则返回 true;否则返回 false。如果另一线程已锁定为读或写,则该函数将等待,直到 timeout 到期,以便获取锁。
如果获取了锁,则必须在另一个线程成功锁定之前,使用
unlock()释放锁。如果线程已经锁定为读取,则无法进行写入锁定。
也请参见
- tryLockForWrite(timeout)
- 参数:
timeout – int
- 返回类型:
bool
尝试进行写入锁定。此函数如果获取了锁定,则返回
true;否则返回false。如果另一个线程已经进行了读取或写入锁定,此函数将等待最多timeout毫秒,直到锁定变为可用。注意:将负数作为
timeout相当于调用lockForWrite(),即当timeout为负值时,此函数将无限期等待直到写入锁定可用。如果获取了锁,则必须在另一个线程成功锁定之前,使用
unlock()释放锁。如果线程已经锁定为读取,则无法进行写入锁定。
也请参见
- unlock()#
解锁锁。
尝试解锁未锁定的锁是错误行为,并会导致程序终止。