描述:
MSDN里关于Win32 API CreateThread的文档说,用到C运行时库的程序最好用C库函数beginethread代替CreateThread来产生线程,用endthread代替ExitThread结束线程,否则会造成小的内存遗漏。
在ATL项目里,一般地都有宏_ATL_MIN_CRT起作用,这保证编译时连接最小的C运行时库,不知这里使用CreateThread安全否?
能否深入讲讲连接C运行时库为什么会使调用CreateThread产生线程造成内存遗漏?
解决方案1:
Jeff的《Windows核心编程》一书中对这两个创建线程的函数有分析,_beginthreadex的确比CreateThread靠得住。具体的分析我就不重复了
msdn上说CreateThread比_beginthreadex产生更多的内存泄漏,但是我看threadex.c文件的实现代码,并没有什么措施以避免内存泄漏,也许msdn说的可能是假的。不过采用crt总是有用的,因为好移植。
另外,<atlbase.h>还提供了两个模板函数
template <typename T>
HANDLE CreateThreadT(LPSECURITY_ATTRIBUTES lpsa, DWORD dwStackSize, DWORD (WINAPI * pfn)(T *pparam), T *pparam, DWORD dwCreationFlags, LPDWORD pdw);
template <typename T>
HANDLE AtlCreateThread(DWORD (WINAPI* pfn)(T *pparam), T *pparam);
没有任何官方文档可以说明它们,但是VC6.0,VC7.0,VC7.1都有这两个函数,可以放心使用。它们可以针对不同的编译开关自动选择使用crt,或者直接使用API。
您可能想查找下面的文章:
- 急,我有一多线程程序在NT下运行良好,但在98下_beginthreadex返回0
- 为什么我在程序中已经声明了#include<processh>还是不能用_beginthreadex
- _beginthreadex是工作线程,一次执行完后线程就结束了,用它如何能监视串口呀?神呀,救救我吧,我快不行了!
- _beginthread和_beginthreadex有什么不同啊
- _beginthreadex创建的线程能不能调用Getexitcodethread()?
- 关于_beginthreadex的第四个参数!
- 为什么我在程序中已经声明了#include<processh>还是不能用_beginthreadex
- 使用_beginthreadex创建线程失败
- 请问用_beginthreadex创建的线程是否可以在线程函数里调用MFCAPI或WIN32API函数
- beginthreadex怎么用呀?