我使用Qt 4.8.4和PyQt 4.10
这是我的测试代码:
#!/usr/bin/env python3
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
class Thread1(QThread):
def run(self):
print('thread1 %d' % QThread.currentThreadId())
mutex.lock()
QThread.sleep(5)
mutex.unlock()
class Thread2(QThread):
def run(self):
tid = QThread.currentThreadId()
print('%d tid enters' % tid)
mutex.lock()
print(tid)
app = QApplication(sys.argv)
print('main thread %d' % QThread.currentThreadId())
mutex = QMutex()
t = Thread1()
t.start()
QThread.sleep(1)
threads = [Thread2() for i in range(10)]
for thread in threads:
thread.start()
app.exec()
我的问题是:当thread1调用mutex.unlock()时,只会唤醒一个被阻塞的线程。
这是输出:
main thread 140017224202048
thread1 140016996386560
140016987993856 tid enters
140016979601152 tid enters
140016962815744 tid enters
140016971208448 tid enters
140016672044800 tid enters
140016646866688 tid enters
140016638473984 tid enters
140016954423040 tid enters
140016663652096 tid enters
140016655259392 tid enters
140016987993856
该文件没有说明如何唤醒所有被阻止的内容。我怎样才能做到这一点? THX
答案 0 :(得分:1)
根据定义,mutex限制(或保护)一段代码,以便只有一个线程可以一次访问它。所以你不能醒来"所有线程,如果他们都等待一个互斥锁,也许你需要很多互斥(每个一个"资源")或依赖或设计和约束或你的真实项目(因为你发布了#34的代码;测试应用程序")可能semaphore更适合。
答案 1 :(得分:0)
尝试QWaitCondition,您可以将condition.wakeAll()用于您的目的。
答案 2 :(得分:0)
不知道你是否还需要这个。但我认为你错过了 你的Thread2类中的mutex.unlock。
您的代码应如下所示:
class Thread2(QThread):
def run(self):
tid = QThread.currentThreadId()
print('%d tid enters' % tid)
mutex.lock()
print(tid)
mutex.unlock() # line Missing