条件変数はミューテックスとは異なります。つまり、それらを制御する単一のスレッドだけで使用できるわけではありません。条件変数を保護するミューテックスはそのように扱われますが、それは短時間だけロックされ、条件変数をキック(シグナリング)した後にスレッドによって手動でロック解除され、そのようなキックを待機しているスレッドによって自動的にロック解除されます。
完全に別個のスレッド(デッドロック検出器のように、スレッド3と呼びましょう)を条件変数の1つにキックするだけで、それを待機しているスレッドをウェイクアップできます。
条件変数の通常のユースケースは、スレッドがキックを待機してから、とにかく作業が行われていることを確認することです(変数がキックされたという理由だけで作業があると想定しないでください)。それは偽の目覚めの世話をすることです。
1つの可能性は、デッドロックを検出したときにスレッド3が設定する「グローバル」deadlock_occurredフラグを設定し、スレッド3にすべての条件変数をキックさせることです。
スレッド1と2が起こされた後に最初に行うべきことは、そのフラグをチェックして適切なアクションを実行することです(おそらくスレッドを終了します)。
スレッドが自身の存続期間を担当するようにアプリケーションを設計すると、デッドロックタイプの問題がはるかに少なくなることがわかります。スレッドが終了しやすい状態にない場合、スレッドを外部から強制終了するのは簡単すぎます。誤解しないでください。キャンセルポイントを使用するなど、他の方法で処理できますが、試行錯誤したソリューションは、これまでに見つけた中で最も簡単なものです。