我正在处理线程,并有潜在的死锁问题。 有人向我提到一个装载机锁。
我无法在网上find很多信息。 有人可以帮我解释一下,“什么是装载机锁 ”?
例如,查看这个问题:
装载机锁定错误
加载器锁定的一般概念:系统在锁内部运行
DllMain
的代码(作为同步锁)。 因此,在DllMain
运行不重要的代码是“要求死锁”
我刚才提到的答案是基于这篇文章:
另一个在DllMain
不要做任何可怕事情的原因是:无意之间的僵局
您的DllMain函数在加载程序锁中运行,这是操作系统允许您在其中一个内部锁持有时运行代码的几次之一。 这意味着您必须格外小心,不要违反
DllMain
的锁定层级; 否则,你正在寻求僵局。加载程序锁定由需要访问加载到进程中的DLL列表的任何函数执行。 这包括像
GetmoduleeHandle
和GetmoduleeFileName
函数。 如果您的DllMain
进入临界区或在同步对象上等待,并且临界区或同步对象由某个代码所拥有,而这些代码又等待加载程序锁定,则只会创建一个死锁:
// global variable CRITICAL_SECTION g_csGlobal; // some code somewhere EnterCriticalSection(&g_csGlobal); ... GetmoduleeFileName(MyInstance, ..); LeaveCriticalSection(&g_csGlobal); BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { switch (fdwReason) { ... case DLL_THREAD_DETACH: EnterCriticalSection(&g_csGlobal); ... } ... }
请仔细阅读整篇文章以充分理解。