PySide6.QtCore.QMutex¶
- class QMutex¶
-
概要¶
方法¶
def
__init__()
def
tryLock()
注意
本文档可能包含从C++自动翻译到Python的代码片段。我们始终欢迎对代码片段翻译的贡献。如果您发现翻译问题,您也可以通过在我们的https:/bugreports.qt.io/projects/PYSIDE上创建工单来告知我们。
详细描述¶
警告
本节包含从C++自动翻译到Python的代码片段,可能包含错误。
QMutex
的目的是保护一个对象、数据结构或代码段,以便一次只有一个线程可以访问它(这类似于 Java 的synchronized
关键字)。通常最好与QMutexLocker
一起使用互斥锁,因为这样可以轻松确保锁定和解锁操作一致执行。例如,假设有一个方法可以向用户打印两行消息:
number = 6 def method1(): = 5 number /= 4 def method2(): = 3 number /= 2
如果连续调用这两种方法,会发生以下情况:
# method1() = 5 # number is now 30 number /= 4 # number is now 7 # method2() = 3 # number is now 21 number /= 2 # number is now 10
如果这两个方法同时从两个线程调用,则可能会出现以下序列:
# Thread 1 calls method1() = 5 # number is now 30 # Thread 2 calls method2(). # # Most likely Thread 1 has been put to sleep by the operating # system to allow Thread 2 to run. = 3 # number is now 90 number /= 2 # number is now 45 # Thread 1 finishes executing. number /= 4 # number is now 11, instead of 10
如果我们添加一个互斥锁,我们应该得到我们想要的结果:
mutex = QMutex() number = 6 def method1(): mutex.lock() = 5 number /= 4 mutex.unlock() def method2(): mutex.lock() = 3 number /= 2 mutex.unlock()
那么在任何给定时间,只有一个线程可以修改
number
,结果是正确的。当然,这是一个简单的例子,但它适用于任何其他需要按特定顺序发生的情况。当你在一个线程中调用
lock()
时,其他尝试在同一位置调用lock()
的线程将会阻塞,直到获得锁的线程调用unlock()
。一个非阻塞的替代方法是tryLock()
。QMutex
在无竞争情况下进行了优化以保持快速。如果该互斥锁没有竞争,它将不会分配内存。它的构造和销毁几乎没有开销,这意味着将许多互斥锁作为其他类的一部分是可行的。另请参阅
QRecursiveMutex
QMutexLocker
QReadWriteLock
QSemaphore
QWaitCondition
- __init__()¶
构造一个新的互斥锁。互斥锁在创建时处于未锁定状态。
- tryLock(timeout)¶
- Parameters:
超时 –
QDeadlineTimer
- Return type:
布尔
尝试锁定互斥锁。如果成功获取锁,此函数将返回
true
;否则返回false
。如果另一个线程已经锁定了互斥锁,此函数将等待直到timer
过期,互斥锁变为可用。如果锁被获取,互斥锁必须在另一个线程成功锁定之前使用
unlock()
解锁。在同一线程上多次调用此函数会导致死锁。
- tryLock(timeout)
- Parameters:
timeout – int
- Return type:
布尔
尝试锁定互斥锁。如果成功获取锁,此函数将返回
true
;否则返回false
。如果另一个线程已经锁定了互斥锁,此函数将最多等待timeout
毫秒,直到互斥锁变为可用。注意:将负数作为
timeout
传递等同于调用lock()
,即如果timeout
为负数,此函数将永远等待,直到互斥锁可以被锁定。如果锁被获取,互斥锁必须在使用
unlock()
解锁之前,另一个线程才能成功锁定它。在同一线程上多次调用此函数会导致死锁。