我正在处理线程并且存在潜在的死锁问题。有人向我提到装载机锁。
我在网上找不到太多信息。有人可以帮我解释一下,“什么是 Loader Lock ”?
答案 0 :(得分:6)
例如,请查看此问题:
加载程序锁定的一般概念:系统在锁定内部运行
DllMain
中的代码(如同步锁定)。因此,在DllMain
内运行非平凡的代码是“要求死锁”
我刚才提到的答案基于这篇文章:
Another reason not to do anything scary in your DllMain
: Inadvertent deadlock
您的DllMain函数在加载程序锁定内部运行,操作系统允许您在保持其内部锁定之一的同时运行代码。这意味着您必须格外小心,不要违反
DllMain
中的锁定层次结构;否则,你要求陷入僵局。加载程序锁定由需要访问加载到进程中的DLL列表的任何函数执行。其中包括
GetModuleHandle
和GetModuleFileName
等功能。如果您的DllMain
进入关键部分或等待同步对象,并且该关键部分或同步对象由某些代码拥有,而这些代码又在等待加载程序锁定,那么您刚刚创建了一个死锁:
// global variable
CRITICAL_SECTION g_csGlobal;
// some code somewhere
EnterCriticalSection(&g_csGlobal);
... GetModuleFileName(MyInstance, ..);
LeaveCriticalSection(&g_csGlobal);
BOOL WINAPI
DllMain(HINSTANCE hinstDLL, DWORD fdwReason,
LPVOID lpvReserved)
{
switch (fdwReason) {
...
case DLL_THREAD_DETACH:
EnterCriticalSection(&g_csGlobal);
...
}
...
}
请仔细阅读整篇文章。
答案 1 :(得分:0)
加载器指的是操作系统(模块)loader。 加载器锁是加载器用来同步对 DllMain 的调用的系统锁。 这样,加载器可确保 DLL 所需的初始化/清理任务以线程安全的方式执行。
这个系统锁用于静态初始化、静态销毁和线程创建。它也被各种 Win32 API 共享。
Preventing Hangs in Windows Applications
<块引用>(...) 操作系统有自己的内部特定于进程的锁,有时在您的代码执行时会持有该锁。这个锁是在 DLL 加载到进程中时获取的,因此被称为“加载器锁”。 DllMain 函数总是在加载器锁下执行; (...)
<块引用>调用某些 Win32 API 也可能会在您的计算机上获取加载程序锁 代表 - LoadLibraryEx、GetModuleHandle 等函数,尤其是 共同创建实例