遅延ロードされたDLL内に1つのインスタンス(グローバル/静的オブジェクト)ClassAがあります。内部のこのオブジェクトには、正常なシャットダウンを実行するために必要な「オブザーバー」スレッドがあります。FreeLibraryを呼び出すと、この静的オブジェクトの削除中に、スレッドがシャットダウンを要求しましたが、_endthreadex()でハングし、デッドロックが発生することに気付きました。_endthreadexを明示的に呼び出すか暗黙的に呼び出すかは関係ありません。オブジェクトがグローバルであるか静的であるかは関係ありません-同じ結果です。このスレッドはClassBでラップされています(カスタムメッセージループを使用してテンプレートによって実装されます)。スレッドをシャットダウンする要求(メッセージの投稿)があり、WaitForSingleObjectに続いて、指定されたスレッドハンドルに対して戻ることはありません。
コードとシャットダウンのどこでも使用されているのと同じ「テンプレートスレッドクラス」がうまく機能します。静的オブジェクトを削除するときの唯一の問題。_endthreadex()の内部には、dllのアンロードと静的オブジェクトの削除時にすでにロックされているロックがあると思います。
スレッドは_beginthreadexで始まりました。ps。アプリ内で同じ静的オブジェクトをインスタンス化すると、アプリは重大な問題なしに閉じます。
_endtreadexがデッドロックを引き起こす理由はありますか?それを回避する方法は?