2

それについてのQtドキュメントQMutexでは次のように述べられています:

(...)スレッドでlock()を呼び出すと、同じ場所でlock()を呼び出そうとする他のスレッドは、ロックを取得したスレッドがunlock()を呼び出すまでブロックします。lock()の非ブロッキング代替手段はtryLock()です。(...)

私はこのコードを何度も使用しています:

QMutex mutex;<br>
while( !mutex.tryLock() );

誰かが私にこのtryLock()メソッドがどのように構築されているかを説明できますかwhile()?ループはプログラム全体をハングさせませんか?

2つのスレッドが1つを共有QMutexし、通信FIFOとして機能します。1つのスレッドがデータを送信し、別のデータが2番目のスレッドにスケジュールされている場合、そのスレッドは最初のスレッドが完了するのを待機しています。通信はModbus標準に準拠しています-send1-receive1、send2-receive2。

並列送受信はできません。したがって、常に1つのスレッドがアクティブで、残りは待機しています。

QMutex mutex; 
thread1() { 
    while( !mutex.tryLock() )
        ; 
    doThread1Job(); 
} 

thread2() { 
    while( !mutex.tryLock() )
        ; 
    doThread2Job(); 
} 
4

1 に答える 1

3

tryLock()GUIスレッドでスピンしている場合は、もちろんユーザーインターフェイスがブロックされます。AtryLock()は、イベントループなどをスピンしません。あなたの場合、tryLock()ループは単にを呼び出すのと同じlock()です。

の非ブロッキングの代替手段tryLock()は、次のように使用する必要があります。失敗した場合は、待機して再試行します。singleShot再試行スロットを起動するようにQTimerを設定します。

いずれにせよ、独自の同期手段を実装するよりも、作業スレッドから待機中のスレッドにQtシグナルを送信する方がおそらく簡単でしょう。

于 2012-05-29T19:07:00.267 に答える