- 1、本文档共5页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
CreateThread与_beginthread,内存泄漏为何因
CreateThread _beginthread,内存泄漏为何因
作者: 卓然 日期:2011 年11 月14 日 20:10 分类:C/C++ 标签: C++ 内存泄漏_beginthreadex
CreateThread 来自/post/101
在写c++代码时 ,一直牢记着一句话 :决不应该调用CreateThread。相反 ,应该使用Visual C++运行
期库函数_beginthreadex。
好像CreateThread 函数就是老虎,既然这样为什么微软要开发这个函数呢?
从网上找到的相关资料,现在汇总一下,在此对相关人员进行感谢!
摘自《windows 核心编程》:
CreateThread 函数是用来创建线程的Windows 函数。不过 ,如果你正在编写C/C++代码 ,决不应该
调用CreateThread。相反 ,应该使用Visual C++运行期库函数_beginthreadex。如果不使用 Microsoft
的Visual C++编译器,你的编译器供应商有它自己的CreateThred 代函数。
若要使多线程C 和C++程序能够正确地运行,必须创建一个数据结构 ,并将它与使用C/C++运行期库
函数的每个线程关联起来。当你调用C/C++运行期库时 ,这些函数必须知道查看调用线程的数据块 ,这样
就不会对别的线程产生不良影响。
1.每个线程均获得由C/C++运行期库的堆栈分配的自己的tiddata 内存结构。
2.传递给_beginthreadex 的线程函数的地址保存 tiddata 内存块中。传递给该函数的参数也保存在该
数据块中。
3._beginthreadex 确实从内部调用CreateThread ,因为这是操作系统了解如何创建新线程的唯一方
法。
4.当调用CreatetThread 时 ,它被告知通过调用_threadstartex 而不是pfnStartAddr 来启动执行新线
程。 还有,传递给线程函数的参数是tiddata 结构而不是pvParam 的地址。
5.如果一切顺利 ,就会像CreateThread 那样返回线程句柄。如果任何操作失败了 ,便返回 NULL。
_beginthreadex 和_beginthread 函数的区别。_beginthread 函数的参数比较少 ,因此比特性全面的
_beginthreadex 函数受到更大的限制。
例如 ,如果使用_beginthread ,就无法创建带有安全属性的新线程,无法创建暂停的线程,也无法获得
线程的ID 值。
下面摘录Csdn 中的Holly ()的帖子进行解释 ,再次表示感谢。
来源 :[url]/t10/31810.html[/url]
Holly ():
oldworm 提供了很好的使用的例子 ,而且也运用了编译控制 !
我来解释一下理论上的区别 :
CreateThread、_beginthread 和_beginthreadex 都是用来启动线程的,但大家看到oldworm 没有提
供_beginthread 的方式 ,原因简单 ,_beginthread 是_beginthreadex 的功能子集 ,虽然_beginthread
内部是调用_beginthreadex 但他屏蔽了象安全特性这样的功能 ,所以_beginthread 与CreateThread 不
是同等级别 ,_beginthreadex 和CreateThread 功能上完全可 代,我们就来比较一下_beginthreadex
与CreateThread!
CRT 的函数库在线程出现之前就已经存在,所以原有的CRT 不能真正支持线程 ,这导致我们在编程的时
候有了CRT 库的选择 , MSDN 中查阅CRT 的函数时都有:
Libraries
LIBC.LIB Single thread static library, retail version
LIBCMT.LIB Multithread static library, retail version
MSVCRT.LIB Import library for MSVCRT.DLL, retail version
这样的提示 !
对于线程的支持是后来的事 !
这也导致了许多CRT 的函数 多线程的情况下必须有特殊的支持 ,不能简单的使用CreateThread 就
OK。
大多的CRT 函数都可以
文档评论(0)