研究下DllMain为什么会因为不当操作导致死锁的问题。首先我们看一段比较经典的“DllMain中死锁”代码。
//主线程中
HMODULE h = LoadLibraryA(strDllName.c_str());
// DLL中代码
static DWORD WINAPI ThreadCreateInDllMain(LPVOID) {
return 0;
}
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
DWORD tid = GetCurrentThreadId();
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH: {
printf("DLL DllWithoutDisableThreadLibraryCalls_A:\tProcess attach (tid = %d)\n", tid);
HANDLE hThread = CreateThread(NULL, 0, ThreadCreateInDllMain, N

本文探讨了DllMain中由于不当操作导致的死锁问题。通过分析代码和调用堆栈,揭示了死锁源于主线程等待工作线程结束,而工作线程在初始化过程中因尝试进入临界区(LoaderLock)而被阻塞,导致双方互相等待,形成死锁。理解此问题有助于避免在DLL编程中出现类似错误。
订阅专栏 解锁全文
1295

被折叠的 条评论
为什么被折叠?



