class QMutex#

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

Inheritance diagram of 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()lock() 的非阻塞替代方案是 tryLock()

QMutex 在非竞争情况下进行了优化以快速运行。如果没有竞争发生在该互斥锁上,它不会分配内存。它的构造和销毁几乎没有开销,这意味着它可以作为其他类的一部分存在很多互斥锁。

__init__()#

构造一个新的互斥锁。互斥锁以未锁定的状态创建。

tryLock(timeout)#
参数:

timeoutQDeadlineTimer

返回类型:

bool

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

如果获得了锁,另一个线程在成功锁定它之前必须使用 unlock() 释放互斥锁。

从同一线程多次调用此函数将对同一互斥锁造成 死锁

另请参阅

lock() unlock()

tryLock(timeout)
参数:

timeout – int

返回类型:

bool

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

注意:将负数作为 timeout 是调用 lock() 的等效操作,即如果 timeout 为负,则此函数将无限期等待,直到互斥量可以锁定。

如果获得了锁,另一个线程在成功锁定它之前必须使用 unlock() 释放互斥锁。

从同一线程多次调用此函数将对同一互斥锁造成 死锁

另请参阅

lock() unlock()