2017-10-04 6 views
-3

私はCコードで書かれた2つのスレッドを作成し、Linux OS上で実行しています。どちらのスレッドも何らかの仕事をしていて、その親プロセスが生きている間永久に実行されています。それらのスレッドを作成しスレッドがデッドロック状態にあるかどうかを知る方法?

プロセスは、いくつかの間隔でsystemdにウォッチドッグ通知を送信しています。ただし、ウォッチドッグ通知を送信する前に、すべてのスレッドが非デッドロック状態にあるかどうかを確認する必要があります。

スレッドがデッドロック状態になっていないことを知るために、どのようなシステムコールを使用することができるか、どのようなメカニズムを使用することができるのか、プロセスが作成したスレッドがデッドロック状態かどうかをチェックし、すべてのスレッドが非デッドロック状態にある場合は、ウォッチドッグ通知をsystemdに送信します。

+1

スレッドは、システムリソースを獲得する親スレッドのタイムスタンプを保存しようとしている手順1で開始したループを続けます。スレッドがシステムリソースを取得すると、タイムスタンプは無効になります。親スレッドがタイムスタンプをいくつかの制限より古いと判断した場合は、システムがデッドロックしていると宣言できます。 – user3386109

+0

親スレッドのタイムスタンプを保存することはどういう意味ですか?子スレッドがシステムリソースを取得しようとしていることを親スレッドがどのように知るか。 –

+0

OSはこれを効果的な方法で判断できません。そのようなチェックをあなたのアプリデザインに組み込む必要があります。あなたがそれを望むならば、それをデザインすることができます。 –

答えて

1

それを行うための最も簡単な方法は、あなたが定期的に独自の共有変数を更新追跡する必要がある各スレッドを持つことです。監視は、共有変数が値を頻繁に変更するかどうかを確認することから構成されます。

はアナロジーを考えてみましょう。あなたは非常に頻繁に家にいませんが、あなたの2人の子供が消えていないことを確認したいです。だから、あなたはそれぞれの子供のための瓶があります。彼らは彼らが家に帰るたびに瓶にペニーを加えるように伝えます。今、あなたが家に帰るたびに、あなたは各瓶のペニーを数えます。子供の瓶に同じ数のペニーが長時間入っていると、問題があることが分かります。

したがって、たとえば、あなたはから仕事をしている各スレッドを変更することができますいくつかの作業を行う

  1. ゴー1.

への:

  1. いくつかの作業を行います。
  2. 進捗変数をインクリメントします。
  3. ゴー1.

に進むそして、監視スレッドはそれが状態変数と現在の値に異なる値を見た最後の時間を追跡することがあります。次に、デッドロックされたスレッドを次のように検出できます。

  1. 監視しているスレッドごとにループします。
  2. 状態変数が前回と異なるのですか?そうでない場合は、手順5に進みます。
  3. 状態変数に表示されている値を保存し、現在の時刻を保存します。
  4. 手順1で開始したループを続行します。
  5. このスレッドの最後の更新のために保存した時間が過去にあまりに離れていますか?その場合は、デッドロックを報告してください。
  6. たちは
+0

私は2番目のケースがいくつかのケースで動作すると思います。仮定すると、select in loopとthreadはブロッキング状態にあります。それは、get信号を選択した後にのみ '状態変数'のみが更新される場合にのみループを継続します。メインスレッドが古い値を保持していることを確認したため、デッドロックが報告されるため、メインスレッドが状態変数をチェックしている時間間隔でselectがトリガされないため、ある間隔でこのスレッドを監視しているメインスレッドは古い変数値を取得します。スレッドはデッドロック状態ではありません。 –

+0

@VikashRanjan 'select'に適切なタイムアウトを設定する必要があります。それ以外の場合は、パイプの終わりを 'select'セットに追加し、監視スレッドがそれを使ってトリガさせるようにしてください。はい、これはデザインに組み込む必要があります - それはあなたが無作為に上に振りかけるものではありません。 –

+0

@VikashRanjan私の答えをお読みください。それは私が説明するものです。ステート変数を頻繁にインクリメントするようにスレッドを設計し、変化していなければデッドロックします。 –

関連する問題