パラメータ DLL_THREAD_DETACH を使用して DLLMain エントリ ポイントから呼び出された関数でローカル静的変数の初期化が発生すると、アプリケーションでデッドロックが発生します。
以下はWindbg分析です
これは通常、別のスレッドがローダー ロックを保持していることが原因です。
以下は、保持されているロックです。
CritSec ntdll!LdrpLoaderLock+0 (7c97e178)
ロックカウント 3
再帰回数 1
所有スレッド 17e8
EntryCount d
ContentionCount d
*** ロックされています
CritSec MSVCR80!__app_type+94 で 781c3bc8
ロックカウント 1
再帰回数 1
所有スレッド 1100
エントリ数 1
ContentionCount 1 *** ロック済み
#呼び出しスタック スレッド 17e8
781c3bc8 78132bd9 0777fde4 ntdll!RtlEnterCriticalSection+0x46
00000008 b87d2630 00000000 MSVCR80!_lock+0x2e
0864ae10 08631d7f 0864ae10 EPComUtilities32!_onexit+0x36
0864ae10 b87d2588 00000001 EPComUtilities32!atexit+0x9
0777fea8 0864719f 08630000 EPComUtilities32!XCriticalSectionEx::ThreadTerminated+0x5f
08630000 00000003 00000000 EPComUtilities32!DllMain+0x20
08630000 7c90118a 08630000 EPComUtilities32!__DllMainCRTStartup+0x7a
08630000 00000003 00000000 EPComUtilities32!_DllMainCRTStartup+0x1d
#コール スタック スレッド 1100
000000b0 00000000 00000000 ntdll!ZwWaitForSingleObject+0xc
000000b0 ffffffff 00000000 kernel32!WaitForSingleObjectEx+0xa8
000000b0 ffffffff 06ce64e0 kernel32!WaitForSingleObject+0x12
000480ba 000f4240 00000000 CATSysMultiThreading!CATThreads::Join+0xf5
0012fcc8 00000004 00000000 JS0GROUP!CATLM::StopHB+0xf4
d138509f 00416694 00000001 JS0GROUP!CATLM::Unmake+0x6b
00000000 00000000 00000000 MSVCR80!_cinit+0xd6
00000000 0012fd6c 081e68d9 MSVCR80!exit+0xd
00000000 06d404f0 0998fb90 JS0GROUP!CATExit+0x1d
00000000 004ef366 0000000d DNBPLMProvider!DNBEPLMTransactionMgt::OnApplicationExit+0x229
00000000 0012fd9c 004eabfc JS0GROUP!CATCallExits+0x2bc
00000000 0012ff7c 0040cefd JS0GROUP!CATErrorNormalEnd+0x31 00000000 06ce71d0 06ce71d0 JS0GROUP!CATExit+0xc
00000007 06cdb120 059b61d8 DLMMfgContextSolver!main+0x146d
ffffffff ffffffff bffde000 DLMMfgContextSolver!__tmainCRTStartup+0x10f
#デッドロックの原因を理解するためにコメントをお願いします。注:静的変数を非静的にする瞬間、問題はフォーラムに投稿された例のコンテキストで消えます関数スコープの静的変数でデッドロックが発生します(VC ++ではスレッドが安全ではありません)