欢迎访问宙启技术站
智能推送

PyQt5.QtCoreQMutex()的使用示例:实现多个线程等待同一资源

发布时间:2024-01-10 01:39:01

PyQt5.QtCore.QMutex()是PyQt5中的一个线程同步对象,用于实现多个线程之间对共享资源的互斥访问。

QMutex提供了两个主要的方法:lock()和unlock()。当一个线程调用lock()方法时,如果资源正在被其他线程使用,则该线程将被阻塞,直到资源被释放。当资源被释放后,该线程就可以获得对资源的独占访问权。当线程完成对资源的操作后,应该调用unlock()方法将资源释放,以便其他线程可以获得对资源的访问权。

下面是一个使用PyQt5.QtCore.QMutex()实现多个线程等待同一资源的例子:

import sys
from PyQt5.QtCore import QThread, QMutex

class SharedData(object):
    def __init__(self):
        self.mutex = QMutex()
        self.count = 0

class Worker(QThread):
    def __init__(self, id, data):
        super().__init__()
        self.id = id
        self.data = data

    def run(self):
        self.data.mutex.lock()  # 加锁
        print(f"Thread {self.id} acquired lock")
        for i in range(10):
            self.data.count += 1
        self.data.mutex.unlock()  # 解锁
        print(f"Thread {self.id} released lock")

if __name__ == "__main__":
    data = SharedData()  # 创建共享数据对象
    threads = []
    for i in range(5):
        thread = Worker(i, data)  # 创建线程对象
        threads.append(thread)
        thread.start()  # 启动线程

    for thread in threads:
        thread.wait()  # 等待所有线程执行完毕

    print(f"Final count: {data.count}")

在上述例子中,我们首先创建了一个共享数据对象SharedData,其中包含了一个QMutex对象和一个用于计数的count变量。

然后我们创建了5个Worker线程对象,每个线程对象都有一个 的id和共享数据对象data。每个线程在执行时会先加锁,然后对count变量进行加法操作,最后解锁。由于我们使用了QMutex,所以同一时刻只有一个线程可以获得对count变量的访问权。

最后,我们通过调用thread.wait()等待所有线程执行完毕,并打印最终的count值。

总结:PyQt5.QtCore.QMutex()是一个非常有用的线程同步对象,可以用于实现多个线程对共享资源的互斥访问。在多线程编程中,使用QMutex可以有效地避免资源竞争和数据不一致的问题。