DLL死锁产生原因与调试方法

产生死锁的四个必要条件:

互斥条件:一个资源每次只能被一个进程使用。 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。

BOOL DisableThreadLibraryCalls( [in] HMODULE hLibModule ); DisableThreadLibraryCalls函数的作用 禁用指定动态链接库 (DLL) 的 DLL_THREAD_ATTACH 和 DLL_THREAD_DETACH 通知。 对于具有许多 DLL、频繁创建和删除线程并且其 DLL 不需要这些线程级的连接/分离通知的多线程应用程序,这可能是一种有用的优化。远程过程调用 (RPC) 服务器应用程序就是此类应用程序的一个示例。 https://www.cnblogs.com/predator-wang/p/11452138.html

Dll死锁根本原因是因为FreeLibrary的时候会触发DllMain的DLL_PROCESS_DETACH,而线程退出的时候会触发DllMain的DLL_THREAD_ATTACH,由于对DllMain()的调用需要序列化,需要等待0号线程释放锁后,其它线程才能调用。而0号线程又在无限等待1号线程结束,故死锁。 但是DLL_PROCESS_DETACH和DLL_THREAD_DETACH的调用并没有先后顺序,但是调用是序列化的,也就是说只有当某一个调用完成之后才会调用另外一个。DLL_PROCESS_DETACH返回之后即模块调用结束&#

经验分享 程序员 微信小程序 职场和发展