質問: UNIX上のプロセスのデッドロック理由を実際に見つける方法 Unixでは、プロセスが停止しています。デッドロックが発生する可能性がありますか、デッドロックの理由を見つけ、それを削除して回避する方法はありますか? 私はデッドロックの4つの条件を知っています: 1. 相互排除:一度に最大で1つのプロセスにリソースを割り当てることができます(共有しない)。 2. 保留と待機:リソースを保持している処理で別の処理を要求することができます。 3. 優先なし:プロセスはリソースを解放する必要があります。彼らは取り去ることはできません。 4. 循環待ち:チェーンの各メンバーがチェーンの次のメンバーが保持するリソースを待っているような一連のプロセスが必要です。 But, they are theoretical, how to determine a deadlock on unix practically ? Only by seeing that a process does not make progress ? How to find which part of the code cause the deadlock and the reasons ? If you are allowed to use tools, what can be used ? thanks
回答: There is also Valgrind's Helgrind tool: **Helgrind: a thread error detector** > > Helgrindは、POSIX pthreadsスレッドプリミティブを使用するC、C > ++、Fortranプログラムの同期エラーを検出するためのValgrindツールです。 > > > > POSIX > pthreadsの主な概要は、共通のアドレス空間、スレッドの作成、スレッドの結合、スレッドの終了、mutex(ロック)、条件変数(スレッド間イベントの通知)、リーダライタのロック、スピンロック、セマフォ、バリアなどがあります。 > > > > Helgrindは、次の3つのセクションで詳細に説明する3つのクラスのエラーを検出できます。 > > > > 1. POSIX pthreads APIの誤用。 > 2. ロック注文の問題から生じる潜在的なデッドロック。 > 3. データ競合なしでメモリにアクセスする適切なロックまたは同期 > > > このような問題は、再現性のない、タイミングに依存するクラッシュ、デッドロックなどの不正行為を招くことが多く、他の手段で見つけるのが難しい場合があります。 Helgrindはすべてのpthread抽象を認識し、可能な限り正確にその効果を追跡します。 x86およびamd64プラットフォームでは、LOCK命令プレフィックスの使用に起因する暗黙ロックを理解し、部分的に処理します。 Helgrindは、アプリケーションでPOSIX pthreads APIのみを使用する場合に最適です。ただし、カスタムスレッドプリミティブを使用する場合は、helgrind.hで定義されたANNOTATE_ *マクロを使用して、Helgrindにその動作を記述することができます。この機能はValgrindのリリース3.5.0で追加され、実験的なものと見なされます。