_beginthreade和CreateThread分析和总结.pdfVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
CreateThread() _beginthreadex() AfxBeginThread() 、 及、 函数的讨论 2009-05-30 00:27 1157 人阅读评论(2) 收藏举报 操作系统中线程是非常重要的概念,所以关于线程的创建常常有些困扰人的内容。好像创建线程的函 数很多,那么他们之间的有什么联系与区别呢?正如题目给出的三个函数。今天看了看Windows 核心编程, 再找了一些网上的资料,在此想说说这些函数之间的关系和区别。如有不正确的地方,请各位不吝赐教。 首先,需要说明的是这三个函数都与CreateThread 。CreateThread 函数是Windows 的一个API 函数, 其具体的使用方法在 MSDN 和《Windows 核心编程》上都有详细介绍。主要的作用是创建一个线程。 _beginthreadex 函数是C/C++运行库提供的函数,从 _beginthreadex 函数的源代码,可以看出它的主要 动作是:增加了一个名为ptd 的_ptiddata 的结构的处理,然后在调用CreateThread 函数。_ptiddata 是每 个线程都拥有自己的专用的数据结构。关于使用CreateThread 代替_beginthreadex 的结果以及可能出现 的问题在《Windows 核心编程》上讲的很清楚: “也许你想知道,如果调用CreateThread,而不是调用 C/C++运行期库的_beginthreadex 来创建新线程,将会发生什么情况。当一个线程调用要求_ptiddata 结构 的C / C + +运行期库函数时,将会发生下面的一些情况(大多数C / C + +运行期库函数都是线程安全函数, 不需要该结构)。 首先, C / C + +运行期库函数试图(通过调用T l s G e t Va l u e ) 获取线程的数据块的地址。如果返 回N U L L 作为t i d d a t a 块的地址,调用线程就不拥有与该地址相关的_t i d d a t a 块。这时,C / C + + 运行期库函数就在现场为调用线程分配一个_t i d d a t a 块,并对它进行初始化。然后该_t i d d a t a 块 (通 过T l s S e t Va l u e)与线程相关联。此时,只要线程在运行,该_t i d d a t a 将与线程待在一起。这时, C / C + +运行期库函数就可以使用线程的_t i d d a t a 块,而且将来被调用的所有C / C + +运行期函数也 能使用_t i d d a t a 块。 当然,这看来有些奇怪,因为线程运行时几乎没有任何障碍。不过,实际上还是 存在一些问题。首先,如果线程使用C / C + +运行期库的s i g n a l 函数,那么整个进程就会终止运行, 因为结构化异常处理帧尚未准备好。 第二,如果不是调用_ e n d t h r e a d e x来终止线程的运行,那么数据块就不会被撤消,内存泄漏就 会出现(那么谁还为使用C r e a t e T h r e a d 函数创建的线程来调用_ e n d t h r e a d e x 呢?)。”对于 上面所说的两个问题:我也是有疑问的:使用CreateThread 创建线程后,用CloseHandle 函数关闭相应 的线程句柄,不会对_ptiddata 结构进行释放吗? 另外在网上看到一些关于这三个函数的讨论如下: 一直 对这三个创建线程的方法都搞不清楚,不知道在什么情况下该用那种方法,下面是从网上摘录的一些帖子: 1、不要在一个MFC 程序中使用_beginthreadex() 或CreateThread() 。这句话的意思是由于 AfxBeginThread() 是MFC 封装的启动线程的函数,里面包含了很多和MFC 相关的启动信息,而且封装了 一些常用的操作,使用起来也比较简便。而用另外两个函数就需要程序员对类型,安全性检查进行更多的 思考! 2 、用_beginthreadex() 函数应该是最佳选择,因为_beginthreadex() 函数是CRun-timeLibrary 中的函 数,函数的参数和数据类型都是CRun-timeLibrary 中的类型,这样在启动线程时就不需要进行Windows 数据类型和CRun-timeLibrary 中的数据类型之间的

文档评论(0)

tianya189 + 关注
官方认证
文档贡献者

该用户很懒,什么也没介绍

认证主体阳新县融易互联网技术工作室
IP属地上海
统一社会信用代码/组织机构代码
92420222MA4ELHM75D

1亿VIP精品文档

相关文档