c++ - 循環呼び出しを検出する方法は?

c++ deadlock

私はデッドロックの原因とそれらを回避して検出するための戦略/ツールを探していました。

デッドロックの別の潜在的な原因は、ブロッキング関数が他のブロッキング関数を循環的に呼び出し、最終的に呼び出しが戻らないことです。

特に非常に大規模なプロジェクトでは、これを発見するのが難しい場合があります。

それでは、プログラム内の循環呼び出しの検出を自動化できるツール/ライブラリ/テクニックはありますか?

編集:
私は主にCおよびC++でコーディングしているので、可能であれば、それらの言語に適用できるトピックに関する情報を提供してください。

それでも、このトピックはSOでほとんどカバーされていないようです。そのため、他の言語の回答も問題ありません。多分誰かがそれが関連していると思うならそれらはそれ自身のトピックに値する

ありがとう。
答え
同じ非再入可能ロックを取得しようとする循環(または再帰)呼び出しは、ブロッキングシナリオをデバッグする最も簡単な方法の1つです。ロックは確定的であり、簡単にチェックできます。アプリケーションがロックしたら、デバッガーを起動し、スタックトレースを見て、保持されているロックとその理由を理解します。

ロックの問題の一般的な解決策については、ミューテックスの順序付けを提供するいくつかのライブラリを調べて、ミューテックスを順不同でロックしようとしていることを検出できます。このタイプのソリューションは、正しく実装するのが複雑になる可能性がありますが、一度配置すると、すべてのプロセスに強制的に同じ順序でロックを取得させるため(つまり、プロセスAがロックLaを保持し、順序付けが正しいロックLbを取得するには、成功するかロックすることができますが、ロックLbを保持しているプロセスは、Laをロックしようとすることはできません(順序付けの制約が満たされないため)。
関連記事

c++ - セグメンテーション違反と実行時エラー[重複]

c++ - NVCCにx64オブジェクトを生成するように指示するにはどうすればよいですか?

c++ - LuaPlus Metatablesの初心者向け質問

c++ - 明示的な型変換の要件

c++ - ペアベクトルc++の上限

c++ - setjmpがスタックを保存しないのはなぜですか?

c++ - coutをキャプチャして関数にリダイレクトする

c++ - Eclipseを使用してMySQLをC++に接続しますか?

c++ - C++用のどのXSLTプロセッサーですか?

c++ - オブジェクト指向プログラミング-メンバーとしての変数、またはグローバルとしてのヘッダーのみ?