PySide6.QtCore.QMutex

class QMutex

QMutex 类提供了线程之间的访问序列化。更多

PySide6.QtCore.QMutex 的继承图

概要

方法

注意

本文档可能包含从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 在无竞争情况下进行了优化以保持快速。如果该互斥锁没有竞争,它将不会分配内存。它的构造和销毁几乎没有开销,这意味着将许多互斥锁作为其他类的一部分是可行的。

__init__()

构造一个新的互斥锁。互斥锁在创建时处于未锁定状态。

tryLock(timeout)
Parameters:

超时QDeadlineTimer

Return type:

布尔

尝试锁定互斥锁。如果成功获取锁,此函数将返回true;否则返回false。如果另一个线程已经锁定了互斥锁,此函数将等待直到timer过期,互斥锁变为可用。

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

在同一线程上多次调用此函数会导致死锁

另请参阅

lock() unlock()

tryLock(timeout)
Parameters:

timeout – int

Return type:

布尔

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

注意:将负数作为timeout传递等同于调用lock(),即如果timeout为负数,此函数将永远等待,直到互斥锁可以被锁定。

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

在同一线程上多次调用此函数会导致死锁

另请参阅

lock() unlock()