我正在处理线程并且有一个潜在的死锁问题。有人向我提到了装载机锁。
我在网上找不到太多信息。有人可以帮我解释一下,“什么是装载机锁”?
我正在处理线程并且有一个潜在的死锁问题。有人向我提到了装载机锁。
我在网上找不到太多信息。有人可以帮我解释一下,“什么是装载机锁”?
例如,查看这个问题:
加载器锁的一般思想:系统在
DllMain
锁内运行代码(如同步锁)。因此,在里面运行非平凡的代码DllMain
是“要求死锁”
我提到的答案基于这篇文章:
您的 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);
...
}
...
}
请查看整篇文章以获得完整的理解。
Loader 是指操作系统(模块)加载器。加载程序锁是加载程序用来同步调用DllMain的系统锁。这样,加载程序确保 DLL 所需的初始化/清理任务以线程安全的方式执行。
该系统锁用于静态初始化、静态销毁和线程创建。它也由各种 Win32 API 共享。
(...) 操作系统有自己的内部进程特定的锁,有时会在您的代码执行时持有该锁。此锁在 DLL 加载到进程中时获得,因此称为“加载器锁”。DllMain 函数总是在加载程序锁下执行;(...)
调用某些 Win32 API 也可能代表您获取加载程序锁 - 函数如 LoadLibraryEx、GetModuleHandle,尤其是 CoCreateInstance