什么是装载机锁?

bra*_*ter 3 windows multithreading deadlock locking

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

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

VMA*_*Atm 6

例如,请查看此问题:

装载机锁定错误

加载程序锁定的一般思想:系统在DllMain锁定内部运行代码(如同步锁定).因此,在里面运行非平凡的代码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);
   ...
  }
  ...
}
Run Code Online (Sandbox Code Playgroud)

请查看整篇文章以获得完整的理解.

  • @brainydexter:在这种情况下,非平凡基本上意味着"使用Win32 API函数"或"可能需要很长时间才能执行".只有少数已知的安全API函数:"DllMain可以创建同步对象,如关键部分和互斥体,并使用TLS." 请参阅http://msdn.microsoft.com/en-us/library/windows/desktop/ms682583%28v=vs.85%29.aspx (3认同)