2011-12-18 9 views
3

自分の仕事をして終了するスレッドを作成しているアプリケーションがあり、1つ以上のスレッドがデッドロック状態に陥っている場合は、プログラムによる強制的な方法がありますWaitForSingleObjectを越えて進んでいくスレッドのうちの1つがスタックしており、デッドロックを解決していますか?デッドロックスレッドを進めることは可能ですか? WaitForSingleObjectでスタックする

私は必ずしも私はちょうどそれが上に移動(したがってスレッドが「正常」終了することを可能にしたい、スレッドを終了する必要はありません。

(はい、私はこれがの重複のように聞こえる知っています私の以前の質問Delphi 2006 - What's the best way to gracefully kill a thread and still have the OnTerminate handler fire?が、状況は少し異なっている - 。私はここに求めていることは)WaitForSingleObject (Handle, ItCantPossiblyBeWorkingProperlyAfterThisLong)ようWaitForSingleObject (Handle, INFINTE)振る舞いをすることが可能であるかどうかである

私と一緒に優しくしてください

* MORE。情報*

問題は必ずしも私がソースを持っているコードではありません。実際の状況は、スレッドベースのシリアルCOMポートライブラリ(AsyncFree)です。ポートがUSBベースの場合、ライブラリは、ポートを閉じるときに作成する2つのスレッドの間にデッドロックがあるようです。私はすでにこれを長さthis forumで議論しました。私は、WaitForSingleObject呼び出しのうちの1つを無限にならないように再コードし、そのデッドロックを修復しましたが、DelphiのTThread.Destroyルーチンの今回はスレッドシャットダウンシーケンスの後にもう1つ登場しました。

私の理論的根拠は単純です。私のスレッドがデッドロックすると、できる限りコードを修正します。私ができない場合、または私が知らないと思われる場合は、スレッドを終了させたいだけです。私はかわいくする必要はありません。私は私のアプリチョークを持つ余裕がない。

+3

「WaitForSingleObject」コールを* not *に変更するだけで無限になるのはなぜですか? –

+6

デッドロックを修正しました。病気を修正してください。 –

+0

スレッドがデッドロックに陥って、デッドロックの外側にある他のコードを強制的に「移動」させ、「正常に」終了する状況を把握することはできません。私の意見では、デッドロックを避けなければならないという唯一の可能性があります。 – Andreas

答えて

5

WaitForSingleObjectで使用されるハンドルを無効にすることができます(他のスレッドから)。この場合WaitForSingleObjectWAIT_FAILEDを返し、スレッドは '移動先'になります

+0

ありがとう@Serg。私はそれを試してみましょう。 – rossmcm

+0

独創的。恐ろしい、しかし独創的な。 :-) –

4

INFINITEを使用せず、指定されたタイムアウト時間を設定するだけで、タイムアウト時間が満了したか、あなたが待っていたハンドルがシグナル状態になりました。次に、あなたのコードは次に何をするかを決めることができます。別の待ち時間を入力するか、とにかくどこかで「ちょっと待っていましたが、あまりにも長く、私はとにかく終了しました。 もう1つのオプションは、WaitForMultipleObjectsを使用して、イベントと同様にイベントを使用して、必要に応じて待機を終了させることです。利点はタイムアウトが切れる必要はありません。 もちろん、スレッドが目を覚ますと、それが待っていた「メイン」ハンドルが時間内に戻ってこなかったとしても、「例外的」な状態を処理できなければなりません。

関連する問題