例如,请查看此问题:
加载程序锁定的一般思想:系统在
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)
请查看整篇文章以获得完整的理解.
| 归档时间: |
|
| 查看次数: |
6936 次 |
| 最近记录: |