请教微软专家:ATL项目中用CreateThread好,还是_beginthreadex好?

horris 2003-08-09 02:32:46
MSDN里关于Win32 API CreateThread的文档说,用到C运行时库的程序最好用C库函数beginethread代替CreateThread来产生线程,用endthread代替ExitThread结束线程,否则会造成小的内存遗漏。
在ATL项目里,一般地都有宏_ATL_MIN_CRT起作用,这保证编译时连接最小的C运行时库,不知这里使用CreateThread安全否?
能否深入讲讲连接C运行时库为什么会使调用CreateThread产生线程造成内存遗漏?
...全文
242 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
horris 2003-08-22
  • 打赏
  • 举报
回复
看来我只好结贴了, 谢谢arxing和firingme的参与.
horris 2003-08-20
  • 打赏
  • 举报
回复
我认为用VC的CRT,可能_beginthreadex和CreateThread是一样的,MS不至于和自己找别扭。但是第三方CRT就难说了。
微软专家们这么忙呀?
arxing 2003-08-18
  • 打赏
  • 举报
回复
我曾经以为_endthreadex()通过crt会调用当前线程堆栈的所有对象的析构函数,但是通过跟踪发现,我的想法错了。因此_endthreadex()与ExitThread()一样,只是简单地把堆栈指针退到线程堆栈的顶部。所以我才说它们的差别仅仅是一个默认可以处理异常,一个没有。如果添加处理异常的代码,CreateThread()/ExitThread()跟_beginthreadex()/_endthredex()完全一样的作用。
horris 2003-08-17
  • 打赏
  • 举报
回复
我看在MFC上开发最好是用__beginthreadex,因为MFC的源代码就是用的它而不是CreateThread. 我想肯定是有原因的. 我现在最关心的是在ATL工程中, 在_ATL_MIN_CRT宏定义的情况下, 用CreateThread是否安全.
firingme 2003-08-10
  • 打赏
  • 举报
回复
Jeff的《Windows核心编程》一书中对这两个创建线程的函数有分析,_beginthreadex的确比CreateThread靠得住。具体的分析我就不重复了
arxing 2003-08-10
  • 打赏
  • 举报
回复
从功能上没啥差别,唯一差别就是crt thread有个异常处理,当线程出现异常时,如果用户没有处理,它也能安全释放线程。
arxing 2003-08-09
  • 打赏
  • 举报
回复
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。

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧