2012-04-14 11 views

答えて

2

さて、あなたは常に停止問題に起因する最初の場所でデッドロックを検出することはできません。

しかし、あなたが発生しているされ、合理的な疑いを持っていると仮定すると、あなたは多くの選択肢を持っていません。

  • ロックを保持するすべてのスレッドを中断する(つまり、シグナル/例外を送信する)ことができます。しかし、割り込みを処理できるようにする必要があります。

  • キルすべてのスレッド/プロセスが関与します。これは劇的なアクションであり、プログラムによって残りのデータが失われるリスクを犠牲にして残りのシステムを節約します。

+1

死んでロック!=無限ループ[Iはmistranslatingていない限りは...]、したがって、停止問題ではありません。 AFAIKのデッドロックとデータ競合は静的にも検出されますが、NP-Completeです。 – amit

+0

@amit:2つのスレッドがお互いを待っているかどうかを確かめるのは簡単ですが、スリープ*スレッドが目を覚ますことを計画していないことはどうして分かりますか?明らかに、デッドロックの種類と、あなたが仮定していることに依存します。 – Mehrdad

+0

静的に実行できる場合は、バイトコードを解析して動的に行うこともできます。私はデータレースが静的に見つかることができると確信しています、それはNP完全です、私はデッドロック問題と誤解されるかもしれません、あなたは削減を提供できますか? – amit

0

あなたはデッドロックを扱うする方法を求めています。 これは正しい質問ではありません:あなたはそれらを避けるべきです。現実的には、あなたのプログラムがそれらから回復できないので、それらが起こらないことを確認してください。

+0

この記事「デッドロックイミュニティ」に興味があると思います。 http://dslab.epfl.ch/pubs/dimmunix予防と治療の間には幾分かの差があります。 – ewernli

0

あなたがデッドロックタスクの一部を殺し、そして他の人が、その後進むことを願って、そして中に残っていないか、またはすぐにデッドロック、へフォールバックすることができます。これは特に信頼できるものではありません。

デッドロックされたタスクをすべて終了することができます。これにより、外部からの介入なしに決して使用されないリソースが解放されます。しかし、あなたの仕事は今や死んでしまっています。もしあなたが再びそれらを始めるなら、彼らが再びデッドロックすることはできません。 @usrが言うように

は、行うには正しいことは、最初の場所でのデッドロックを回避することです。潜在的なデッドロックはシステムに重大な欠陥があることを示しており、おそらく設計を再考する必要があります。

0

デッドロックされたプロセスからのリソースを一時的に防止します。 プロセスをいくつかのチェックポイントに戻して、必要なリソースを先取りし、後でチェックポイントでプロセスを再開できるようにします。 システムがデッドロックフリーになるまでプロセスを連続的に終了します。

関連する問題