- 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()#
解锁锁。
尝试解锁未锁定的锁是错误行为,并会导致程序终止。