自分の仕事をして終了するスレッドを作成しているアプリケーションがあり、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つ登場しました。
私の理論的根拠は単純です。私のスレッドがデッドロックすると、できる限りコードを修正します。私ができない場合、または私が知らないと思われる場合は、スレッドを終了させたいだけです。私はかわいくする必要はありません。私は私のアプリチョークを持つ余裕がない。
「WaitForSingleObject」コールを* not *に変更するだけで無限になるのはなぜですか? –
デッドロックを修正しました。病気を修正してください。 –
スレッドがデッドロックに陥って、デッドロックの外側にある他のコードを強制的に「移動」させ、「正常に」終了する状況を把握することはできません。私の意見では、デッドロックを避けなければならないという唯一の可能性があります。 – Andreas