DllMain()限入死锁问题分析 (三)

本文深入探讨了DllMain()函数在加载过程中引起的死锁问题,分析了LoadLibrary()与子线程如何进入同一关键区,指出DllMain()在调用前主线程已持有Loader Lock,并强调在DllMain()内不应尝试获取Loader Lock以防止死锁。同时,文中指出MSDN对DllMain()的描述与实验结果存在差异,CreateThread在DllMain中使用可能导致死锁。
摘要由CSDN通过智能技术生成

在前一篇文章《DllMain()限入死锁问题分析 (二)》里,我们分析了LoadLibrary()与子线程访问PebLdr的目的,知道它们要进入同一关键区的原因所在。

下一个问题是,为什么在子线程要进入该关键区时,LoadLibrary()还没有退出关键区?正常情况下LoadLibrary()何时会退出关键区?

继续详细分析ntdll!LdrpLoadDll()函数,发现它在退出关键区之前,做的最主要的一件事是"call    ntdll!LdrpRunInitializeRoutines"。根据前面分析死锁现场时找到的主线程栈回溯,可以知道LdrpRunInitializeRoutines函数最终会调用被加载模块的DllMain()函数。因此,结论就很清晰了,DllMain()被调用之前,主线程就进入了关键区,DllMain()返回以后,主线程才会退出关键区,因此在DllMain()函数中,但凡有需要进入同一关键区的操作,就会引起死锁。

如果仔细阅读MSDN中有关DllMain()的描述,可以找到相关的描述。

(URL:http://msdn.microsoft.com/en-us/library/windows/desktop/dn633971(v=vs.85).aspx#general_best_practices)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值