2

スレッド1が条件変数Aを待機している状況があります。これは、スレッド2によってウェイクアップされる必要があります。スレッド2は、条件変数Bを待機しており、スレッド1によってウェイクアップされる必要があります。条件変数、私はそのようなデッドロック状況を避けることはできません。サイクル(デッドロック)を検出し、デッドロックに参加しているスレッドの1つを終了します。

さて、私がよくわからないのは、条件変数を待機しているスレッド1などのスレッドを単純に終了する方法です。

いくつかのポインタに感謝します。ありがとう

4

1 に答える 1

3

条件変数はミューテックスとは異なります。つまり、それらを制御する単一のスレッドだけで使用できるわけではありません。条件変数を保護するミューテックスはそのように扱われますが、それは短時間だけロックされ、条件変数をキック(シグナリング)した後にスレッドによって手動でロック解除され、そのようなキックを待機しているスレッドによって自動的にロック解除されます。

完全に別個のスレッド(デッドロック検出器のように、スレッド3と呼びましょう)を条件変数の1つにキックするだけで、それを待機しているスレッドをウェイクアップできます。

条件変数の通常のユースケースは、スレッドがキックを待機してから、とにかく作業が行われていることを確認することです(変数がキックされたという理由だけで作業があると想定しないでください)。それは偽の目覚めの世話をすることです。

1つの可能性は、デッドロックを検出したときにスレッド3が設定する「グローバル」deadlock_occurredフラグを設定し、スレッド3にすべての条件変数をキックさせることです。

スレッド1と2が起こされた後に最初に行うべきことは、そのフラグをチェックして適切なアクションを実行することです(おそらくスレッドを終了します)。

スレッドが自身の存続期間を担当するようにアプリケーションを設計すると、デッドロックタイプの問題がはるかに少なくなることがわかります。スレッドが終了しやすい状態にない場合、スレッドを外部から強制終了するのは簡単すぎます。誤解しないでください。キャンセルポイントを使用するなど、他の方法で処理できますが、試行錯誤したソリューションは、これまでに見つけた中で最も簡単なものです。

于 2011-08-02T04:01:49.110 に答える