1

私のコードでは、ワーカー スレッドが gui スレッドにシグナルを送信します。Signal と Slot は Qt::BlockingQueuedConnection 経由で接続されます。

closeEventアプリケーションがワーカー スレッドを停止しようとしていて、イベントが終了したとき。

ワーカー スレッドの関数を呼び出します。

void stop() {
  _isFinished = true;
  wait();
}

次に、ワーカー スレッドが_isFinished状態をチェックし、設定されていない場合はシグナルを送信します。

次の状況をイメージする

The worker            Gui Thread 
=================     =================
if (!_isFinished)     -----------------
-----------------     _isFinished = true;
-----------------     wait();
emit mySignal();      -----------------

明らかに、両方のスレッドがロックされます (デッドロック)。

ミューテックスを追加すると、別のデッドロック状況を見つけることができます。ワーカーがミューテックスをロックすると、GUI スレッドがブロックされます。その結果、送信されたシグナルによってワーカーがロックされます。

どうすればこれに対処できますか?

4

2 に答える 2