我是靠谱客的博主 勤恳柠檬,最近开发中收集的这篇文章主要介绍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返回之后即模块调用结束&#

最后

以上就是勤恳柠檬为你收集整理的DLL死锁产生原因与调试方法的全部内容,希望文章能够帮你解决DLL死锁产生原因与调试方法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(27)

评论列表共有 0 条评论

立即
投稿
返回
顶部