Unixでは、プロセスが停止しています。デッドロックが発生する可能性がありますか、デッドロックの理由を見つけ、それを削除して回避する方法はありますか?
私はデッドロックの4つの条件を知っています:
相互排除:一度に最大で1つのプロセスにリソースを割り当てることができます(共有しない)。
保留と待機:リソースを保持している処理で別の処理を要求することができます。
優先なし:プロセスはリソースを解放する必要があります。彼らは取り去ることはできません。
循環待ち:チェーンの各メンバーがチェーンの次のメンバーが保持するリソースを待っているような一連のプロセスが必要です。
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つのクラスのエラーを検出できます。
このような問題は、再現性のない、タイミングに依存するクラッシュ、デッドロックなどの不正行為を招くことが多く、他の手段で見つけるのが難しい場合があります。
Helgrindはすべてのpthread抽象を認識し、可能な限り正確にその効果を追跡します。 x86およびamd64プラットフォームでは、LOCK命令プレフィックスの使用に起因する暗黙ロックを理解し、部分的に処理します。
Helgrindは、アプリケーションでPOSIX pthreads APIのみを使用する場合に最適です。ただし、カスタムスレッドプリミティブを使用する場合は、helgrind.hで定義されたANNOTATE_ *マクロを使用して、Helgrindにその動作を記述することができます。この機能はValgrindのリリース3.5.0で追加され、実験的なものと見なされます。