マルチスレッドアプリケーションがあります。ワーカー スレッドの 1 つは、ログ記録のために GetModuleFilename を呼び出します。GetModuleFilename を呼び出す前にワーカー スレッドがロックを保持し、永久にブロックするデッドロックが発生しました。
このロック内から GetModuleFilename 呼び出しを削除することはできますし、削除しましたが、デッドロックがどのように発生するかについてはまだ非常に関心があります。
オンラインで読書をする: http://blogs.msdn.com/b/oldnewthing/archive/2004/01/28/63880.aspx
GetModuleFilename がローダーロックを取得するようです。これは、デッドロックのかなり良い候補のように思えました。
ただし、通常、ローダーロック内のスレッドは、上記のリンクのように dllmain を除いて、独自のコードを実行していません。
dll_thread_attach または detach は、ローダーロックと、作成または破棄される別のワーカースレッドで呼び出される可能性がありますが、これが使用しているロックを取得しようとする方法はわかりません。
また、メイン スレッドが GetModuleFilename スレッドが保持しているロックを取得しようとし、3 番目のスレッドがローダーロックを保持し、sendmessage などをメイン スレッドでブロックしている可能性もあります。ここでも、これが発生する状況は見つかりませんでした。
私が疑わしい他のスレッドの 1 つは、com オブジェクトを使用するスレッドです。スレッドは最初に coinitialize を呼び出すため、シングル スレッド アパートメントにする必要があります。ここでローダーロックと相互作用する可能性はありますか?
とにかく、このデッドロックが発生する正確な方法を特定できていません。だから私はいくつかのアイデア、またはローダーロックが取得されている他のケースに関する詳細情報、およびブロックされる可能性のあるローダーロック内でコードが実行される他のシナリオがあるかどうかを期待しています。
ありがとう。