什么是装载机锁?

时间:2012-12-14 07:19:19

标签: windows multithreading locking deadlock

我正在处理线程并且存在潜在的死锁问题。有人向我提到装载机锁。

我在网上找不到太多信息。有人可以帮我解释一下,“什么是 Loader Lock ”?

2 个答案:

答案 0 :(得分:6)

例如,请查看此问题:

Loader lock error

  

加载程序锁定的一般概念:系统在锁定内部运行DllMain中的代码(如同步锁定)。因此,在DllMain内运行非平凡的代码是“要求死锁”

我刚才提到的答案基于这篇文章:

Another reason not to do anything scary in your DllMain: Inadvertent deadlock

  

您的DllMain函数在加载程序锁定内部运行,操作系统允许您在保持其内部锁定之一的同时运行代码。这意味着您必须格外小心,不要违反DllMain中的锁定层次结构;否则,你要求陷入僵局。

     

加载程序锁定由需要访问加载到进程中的DLL列表的任何函数执行。其中包括GetModuleHandleGetModuleFileName等功能。如果您的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 等函数,尤其是 共同创建实例