2022年beginthread和CreateThread区别 .pdf
《2022年beginthread和CreateThread区别 .pdf》由会员分享,可在线阅读,更多相关《2022年beginthread和CreateThread区别 .pdf(4页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、摘录时间:2010-04-05 18:29 _beginthread 和 CreateThread 区别收藏程序员对于Windows 程序中应该用_beginthread 还是 CreateThread 来创建线程, 一直有所争论。本文将从对CRT源代码出发探讨这个问题。I. 起因今天一个朋友问我程序中究竟应该使用_beginthread 还是 CreateThread,并且告诉我如果使用不当可能会有内存泄漏。其实我过去对这个问题也是一知半解,为了对朋友负责,专门翻阅了一下VC的运行库( CRT )源代码,终于找到了答案。II. CRT CRT(C/C+ Runtime Library) 是支
2、持 C/C+运行的一系列函数和代码的总称。虽然没有一个很精确的定义, 但是可以知道, 你的 main 就是它负责调用的,你平时调用的诸如strlen、strtok 、time、 atoi 之类的函数也是它提供的。我们以 Microsoft Visual.NET 2003 中所附带的CRT为例。假设你的 .NET 2003安装在 C:Program FilesMicrosoft Visual Studio .NET 2003 中, 那么 CRT的源代码就在C:Program FilesMicrosoft Visual Studio .NET 2003Vc7crtsrc 中。既然有了这些实现的源代
3、码,我们就可以找到一切解释了。III. _beginthread/_endthread 这个函数究竟做了什么呢?它的代码在thread.c 中。阅读代码,可以看到它最终也是通过CreateThread 来创建线程的,主要区别在于,它先分配了一个_tiddata ,并且调用了_initptd来初始化这个分配了的指针。而这个指针最后会被传递到CRT 的线程包装函数_threadstart中,在那里会把这个指针作为一个TLS (Thread Local Storage)保存起来。然后_threadstart会调用我们传入的线程函数,并且在那个函数退出后调用_endthread 。这里也可以看到,_t
4、hreadstart 用一个 _try/_except 块把我们的函数包了起来,并且在发生异常的时候,调用exit 退出。 (_threadstart 和 endthread 的代码都在thread.c 中)这个 _tiddata 是一个什么样的结构呢?它在mtdll.h 中定义,它的成员被很多CRT函数所用到,譬如int _terrno ,这是这个线程中的错误标志;char* _token , strtok 以来这个变量记录跨函数调用的信息,.。那么 _endthread 又做了些什么呢?除了调用浮点的清除代码以外,它还调用了 _freeptd 来释放和这个线程相关的tiddata 。也就是
5、说,在_beginthread 里面分配的这块内存,以及在线程运行过程中其它CRT函数中分配并且记录在这个内存结构中的内存,在这里被释放了。通过上面的代码,我们可以看到,如果我使用_beginthread 函数创建了线程,它会为我创建好 CRT 函数需要的一切,并且最后无需我操心,就可以把清除工作做得很好,可能唯一需要注意的就是,如果需要提前终止线程,最好是调用_endthread或者是返回,而不要调用ExitThread, 因为这可能造成内存释放不完全。同时我们也可以看出, 如果我们用CreateThread函数创建了线程,并且不对C运行库进行调用(包括任何间接调用),就不必担心什么问题了。
6、IV. CreateThread和 CRT 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 4 页 - - - - - - - - - 或许有人会说,我用CreateThread 创建线程以后,我也调用了C 运行库函数,并且也使用ExitThread 退出了,可是我的程序运行得好好的,既没有因为CRT没有初始化而崩溃,也没有因为忘记调用_endthread 而发生内存泄漏, 这是为什么呢, 让我们继续我们的CRT之旅。假设我用CreateThread 创建了一个线程,我调
7、用strtok 函数来进行字符串处理,这个函数肯定是需要某些额外的运行时支持的。strtok 的源代码在strtok.c 中。从代码可见,在多线程情况下, strtok 的第一句有效代码就是_ptiddata ptd = _getptd() ,它通过这个来获得当前的ptd。 可是我们并没有通过_beginthread 来创建 ptd, 那么一定是 _getptd 捣鬼了。打开tidtable.c ,可以看到 _getptd 的实现,果然,它先尝试获得当前的ptd ,如果不能,就重新创建一个,因此,后续的CRT调用就安全了。可是这块ptd 最终又是谁释放的呢?打开dllcrt0.c ,可以看到一
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年beginthread和CreateThread区别 2022 beginthread CreateThread 区别
限制150内