0

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()

私の問題は、スレッド1がmutex.unlock()を呼び出すと、ブロックされたスレッドが1つだけ目覚めるということです。

出力は次のとおりです。

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

4

3 に答える 3

1

ミューテックスは定義上、コードの 1 つの部分を制限 (または保護) して、一度に 1 つのスレッドだけがアクセスできるようにします。したがって、すべてのスレッドが 1 つのミューテックスを待機している場合、すべてのスレッドを「ウェイク」することはできません。おそらく、多くのミューテックス (「リソース」ごとに 1 つ) が必要になるか、設計と制約、または実際のプロジェクトに依存する必要があります ( 「テスト アプリケーション」)セマフォの方が適している可能性があります。

于 2013-06-03T14:32:54.127 に答える
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
于 2017-01-05T01:58:54.057 に答える