创build线程,CRT和DLL是如何完成的?

所以我明白,CreateThread和CRT可能导致内存泄漏,信号不起作用,而且应该使用_beginthread或_beginthreadex函数。

编写应用程序时,这一切都非常好,但是那些为其他应用程序编写dll等的应用程序(无论是普通的dll,com对象,插件等)。 有没有办法保证如何调用一个DLL的线程创build,即使他们使用__beginthread(前)它很可能打赌他们有一个不同的CRT实现\版本。

那么程序员到底要做什么呢? 不使用CRT? 产生一个内部线程,并卸载所有的工作(不使用调用线程的CRT)? 一些与DllMain和附加/分离的东西伎俩正确设置和closures所有线程,无论如何创build?

CreateThread和CRT可能导致内存泄漏

不,这是一个误解,因为某种原因难以摆脱。 使用_beginthread()在上个世纪是必要的,VS6是VS的最后一个版本,它仍然需要CRT。

这个问题已经得到解决,不过是为了解决对Windows 2000中线程池的支持问题。显然你不能在CRT中做任何事情来处理它们,这些线程是由操作系统本身启动的。 实施非常简单。 无论CRT需要线程局部变量(如strtok()所需的变量),它首先检查TLS存储是否已分配给线程。 如果不是的话,它会即时分配。

只需要使用CreateThread()而不用担心,当然假设你不再使用14岁的编译器。

有两个选项:

  1. 不要使用来自DLL的CRT。
  2. 发送多个DLL,每个支持的工具链版本。

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