5

所以我知道 CreateThread 和 CRT 会导致内存泄漏,信号不起作用,应该使用 _beginthread 或 _beginthreadex 函数。

在编写应用程序时这一切都很好,但是那些正在为其他应用程序编写 dll 的人呢(无论是普通的 c dll、com 对象、插件等)。无法保证调用 DLL 的线程是如何创建的,即使他们使用 __beginthread(ex) 也很可能打赌他们有不同的 CRT 实现\版本。

那么程序员到底应该做什么呢?不使用CRT?生成一个内部线程并将所有工作卸载到该线程(不使用 CRT 和调用线程)?DllMain 和附加/分离东西的一些技巧可以正确设置和关闭所有线程,无论它们是如何创建的?

4

2 回答 2

10

CreateThread 和 CRT 可能会导致内存泄漏

不,这是一个非常难以消除的误解,出于某种原因。在上个世纪使用 _beginthread() 是必要的,VS6 是最后一个具有 CRT 的 VS 版本仍然需要它。

这已经得到修复,在很大程度上是为了处理对添加到 Windows 2000 的线程池的支持。显然你不能在 CRT 中做任何事情来处理它们,这些线程是由操作系统本身启动的。实现非常简单。只要 CRT 需要一个线程局部变量,例如 strtok() 所需的变量,它首先检查是否已经为线程分配了 TLS 存储。如果没有,它会即时分配它。

只需使用 CreateThread() 就不用担心,当然隐含假设您不再使用 14 岁的编译器。

于 2012-08-04T16:35:18.280 回答
2

有两种选择:

  1. 不要使用 DLL 中的 CRT。
  2. 提供多个 DLL,每个受支持的工具链版本一个。

如果 1 不是可接受的解决方案,则选择 2。请注意,无论如何您都必须提供多个 DLL,例如,如果您的用户针对 32 位64 位体系结构进行编译。

于 2012-08-04T12:16:26.293 回答