PySide6.QtCore.QReadWriteLock¶
- 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
类似,当使用Recursive
作为RecursionMode
构造时,QReadWriteLock
可以被同一个线程递归锁定。在这种情况下,必须调用unlock()
与调用lockForWrite()
或lockForRead()
相同的次数。请注意,在尝试递归锁定时,锁类型不能更改,即已经锁定为写入的线程不能锁定为读取(反之亦然)。- class RecursionMode¶
常量
描述
QReadWriteLock.Recursive
在这种模式下,线程可以多次锁定同一个
QReadWriteLock
。只有在进行了相应次数的unlock()
调用后,QReadWriteLock
才会被解锁。QReadWriteLock.NonRecursive
在此模式下,线程只能锁定
QReadWriteLock
一次。另请参阅
QReadWriteLock()
- __init__([recursionMode=QReadWriteLock.RecursionMode.NonRecursive])¶
- Parameters:
recursionMode –
RecursionMode
在给定的
recursionMode
中构造一个QReadWriteLock
对象。默认的递归模式是
NonRecursive
。- lockForRead()¶
锁定锁以进行读取。如果另一个线程已锁定以进行写入,此函数将阻塞当前线程。
如果线程已经锁定以进行写入,则无法锁定以进行读取。
- lockForWrite()¶
锁定锁以进行写入。如果另一个线程(包括当前线程)已经锁定以进行读取或写入(除非锁是使用
Recursive
模式创建的),此函数将阻塞当前线程。如果线程已经锁定了读取,则无法锁定写入。
- tryLockForRead([timeout={}])¶
- Parameters:
超时 –
QDeadlineTimer
- Return type:
布尔
这是一个重载函数。
尝试锁定以进行读取。如果成功获取锁,此函数将返回
true
;否则返回false
。如果另一个线程已锁定以进行写入,此函数将等待直到timeout
过期,以便锁变为可用。如果锁被获取,必须在另一个线程成功锁定它以进行写入之前使用
unlock()
解锁。如果线程已经锁定以进行写入,则无法锁定以进行读取。
另请参阅
- tryLockForRead(timeout)
- Parameters:
timeout – int
- Return type:
布尔
尝试锁定以进行读取。如果成功获取锁,此函数将返回
true
;否则返回false
。如果另一个线程已锁定以进行写入,此函数将最多等待timeout
毫秒,直到锁变为可用。注意:将负数作为
timeout
传递等同于调用lockForRead()
,即当timeout
为负数时,此函数将永远等待,直到可以锁定读取。如果锁被获取,必须在另一个线程成功锁定它以进行写入之前使用
unlock()
解锁。如果线程已经锁定以进行写入,则无法锁定以进行读取。
另请参阅
- tryLockForWrite([timeout={}])¶
- Parameters:
超时 –
QDeadlineTimer
- Return type:
布尔
这是一个重载函数。
尝试锁定以进行写入。如果成功获取锁,此函数将返回
true
;否则返回false
。如果另一个线程已经锁定以进行读取或写入,此函数将等待直到timeout
过期,锁变为可用。如果锁被获取,必须在另一个线程成功锁定之前使用
unlock()
解锁。如果线程已经锁定了读取,则无法锁定写入。
另请参阅
- tryLockForWrite(timeout)
- Parameters:
timeout – int
- Return type:
布尔
尝试锁定以进行写入。如果成功获取锁,此函数将返回
true
;否则返回false
。如果另一个线程已经锁定以进行读取或写入,此函数将最多等待timeout
毫秒,直到锁变为可用。注意:将负数作为
timeout
传递等同于调用lockForWrite()
,即当timeout
为负数时,此函数将永远等待,直到可以锁定写入。如果锁被获取,必须在另一个线程成功锁定之前使用
unlock()
解锁。如果线程已经锁定了读取,则无法锁定写入。
另请参阅
- unlock()¶
解锁锁。
尝试解锁一个未锁定的锁是一个错误,将导致程序终止。