- 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()
。lock()
的非阻塞替代方案是tryLock()
。QMutex
在非竞争情况下进行了优化以快速运行。如果没有竞争发生在该互斥锁上,它不会分配内存。它的构造和销毁几乎没有开销,这意味着它可以作为其他类的一部分存在很多互斥锁。另请参阅
QRecursiveMutex
QMutexLocker
QReadWriteLock
QSemaphore
QWaitCondition
- __init__()#
构造一个新的互斥锁。互斥锁以未锁定的状态创建。
- tryLock(timeout)#
- 参数:
timeout –
QDeadlineTimer
- 返回类型:
bool
尝试锁定互斥锁。如果成功获得锁,此函数返回
true
;否则返回false
。如果另一个线程已经锁定了互斥锁,此函数将等待,直到定时器timeout
过期,互斥锁变为可用。如果获得了锁,另一个线程在成功锁定它之前必须使用
unlock()
释放互斥锁。从同一线程多次调用此函数将对同一互斥锁造成 死锁。
- tryLock(timeout)
- 参数:
timeout – int
- 返回类型:
bool
尝试锁定互斥量。此函数如果成功获得锁定则返回
true
,否则返回false
。如果另一个线程已经锁定了互斥量,此函数将最多等待timeout
毫秒,等待互斥量变为可用。注意:将负数作为
timeout
是调用lock()
的等效操作,即如果timeout
为负,则此函数将无限期等待,直到互斥量可以锁定。如果获得了锁,另一个线程在成功锁定它之前必须使用
unlock()
释放互斥锁。从同一线程多次调用此函数将对同一互斥锁造成 死锁。