CreateThread与FreeLibraryAndExitThread的DLL引用计数问题咨询
关于DLL引用计数与线程操作的问题解答
1. CreateThread()增加DLL引用计数机制的引入时间
该机制是Windows NT 3.1时期引入的——作为Win32子系统的核心特性,它完全区别于Windows 16位系统的线程模型。Win16中没有DLL引用计数概念,而Win32的NT内核为确保DLL在关联线程运行期间不被意外卸载,设计了CreateThread创建线程时自动为包含线程入口点的DLL增加引用计数,线程退出时再递减的逻辑。
2. FreeLibraryAndExitThread()仅递减1次引用计数的原因
这是微软特意设计的行为,核心是避免重复递减计数:
- 正常流程下,线程从入口点返回或调用ExitThread()时,系统会自动为包含线程入口点的DLL递减1次引用计数(对应CreateThread时的递增操作)。
- FreeLibraryAndExitThread()的设计目标是一次性完成"释放DLL"和"退出线程"的操作,它内部会合并两个操作的计数调整:调用FreeLibrary()递减1次计数后,会跳过ExitThread()原本要执行的计数递减步骤,最终整体只递减1次。
- 若按"FreeLibrary()减1 + ExitThread()减1"的逻辑执行,会导致DLL引用计数被多减1次——因为线程入口点对应的DLL引用计数原本只被CreateThread()加了1,重复递减会引发计数异常,甚至导致DLL被错误卸载。
针对当前环境的补充说明
你使用的std::thread和_beginthreadex():
_beginthreadex()是C运行时库(CRT)对CreateThread的封装,完全遵循上述引用计数规则;- Windows平台下的
std::thread通常基于CreateThread或_beginthreadex()实现,同样会触发相同的DLL引用计数变化; - 用WinDbg的
!dlls命令查看计数是准确的,可以直观验证上述逻辑。
内容的提问来源于stack exchange,提问作者Heache Bear
相关产品推荐
相关产品推荐

