所以我知道 CreateThread 和 CRT 可能会导致内存泄漏,信号不起作用,应该使用 _beginthread 或 _beginthreadex 函数。
在编写应用程序时这一切都很好,但是那些为其他应用程序编写 dll 等的人(无论是普通的 c dll、com 对象、插件等)又如何呢?没有办法保证调用 DLL 的线程是如何创建的,即使它们使用了 __beginthread(ex),很可能它们有不同的 CRT 实现\版本。
那么程序员到底应该做什么呢?不使用CRT?生成一个内部线程并将所有工作卸载到该线程(不使用带有调用线程的 CRT)? DllMain 和附加/分离内容的一些技巧可以正确设置和关闭所有线程,无论它们是如何创建的?
CreateThread 和 CRT 可能会导致内存泄漏
不,这是一个由于某种原因很难消除的误解。在上个世纪,使用 _beginthread() 是必要的,VS6 是 VS 的最后一个版本,其 CRT 仍然需要它。
这个问题已经得到修复,在很大程度上是为了处理对 Windows 2000 中添加的线程池的支持。显然,您无法在 CRT 中执行任何操作来处理它们,这些线程是由操作系统本身启动的。实现非常简单。无论 CRT 需要线程局部变量(例如 strtok() 所需的变量),它都会首先检查是否已为线程分配 TLS 存储。如果没有,它会动态分配它。
只需使用 CreateThread() 即可,无需担心,当然,前提是您不再使用 14 年前的编译器。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)