内存泄露风险:_beginthreadex vs CreateThread在多线程编程中的选择

需积分: 13 3 下载量 34 浏览量 更新于2024-08-19 收藏 262KB PPT 举报
本文主要讨论了在Windows多线程编程中创建线程时可能出现的内存泄露问题,特别是针对使用BeginThreadEx函数与CreateThread函数的区别。在侯捷的《win32多线程程序设计》一书中,作者建议在非主线程中使用BeginThreadEx以避免内存泄露,这主要是因为BeginThreadEx在创建线程时会自动分配一个堆结构tiddata,它与线程本地存储TLS相关联,用于存储线程函数入口地址和其他需要的数据,如errno等。 BeginThreadEx是C运行时库函数,它在内部调用了系统API函数CreateThread。问题在于,如果线程在执行过程中调用了需要tiddata结构的运行时库函数,如malloc/free、stdio.h函数、浮点运算等,但未通过EndThreadEx结束线程,tiddata结构将不会被正确释放,从而导致内存泄漏。这是因为运行时库函数在找不到tiddata时会自行创建,如果线程结束时不清理,内存就不会被回收。 然而,这并不意味着在所有场景下都应该避免CreateThread。实际上,权威代码中使用CreateThread的例子可能是因为它们没有遇到内存泄漏的问题,或者开发者已经考虑到了如何正确管理线程生命周期。正确的做法是在创建线程时仅使用那些不需要tiddata的库函数,或者确保线程结束后通过合适的方式清理tiddata,例如使用EndThreadEx或替代方法。 在多核处理器的背景下,文章提到了处理器的发展历史,从单核到双核,展示了技术的进步。多核处理器的出现使得多线程编程成为必要,特别是在资源密集型应用中,可以利用多个核心并行执行任务。GDISorter的多线程设计是一个实际案例,展示了如何在这样的环境中优化线程使用,以提高性能。 总结来说,创建线程时选择BeginThreadEx还是CreateThread,关键在于是否确保线程内使用的函数不会依赖tiddata结构,并在适当的时候清理内存。对于多核处理器下的多线程编程,理解这些内存管理细节至关重要,以避免潜在的性能瓶颈和内存泄漏问题。