CreateThread _beginThread _begintheadex AfxBeginThead思考

CreateThread
创建一个新线程,请不要使用这个函数,因为在线程运行时,常常要用到C运行时库如fopen,malloc,strtok,等函数,这些函数
需要线程局部存储的数据块,这个数据块通常需要在创建线程时建立,如果使用CreateThread,这个数据块就没有建立,在线程
运行时,线程会临时创建这些数据块,而这些数据块的存在线程并不知道,所以在线程退出时也无法清理。从而导致内在泄露

_beginThread
这个函数创建线程,线程结束时去调用endthread或者_endthreadex释放申请的资源,endthread会自动关闭线程的句柄,所以不
用调用CloseHandle;而_endthreadex则不会关闭。
在异步过程调用如WaitForSingleObject等待线程退出,_beginThread函数会有问题
1、当线程结束太快时,返回的线程句柄会出错,有可能会指向另外一个线程句柄
2、当endthread结束时,在重置信号状态前,会销毁线程对象,


_beginThreadex
创建线程比较安全,可以成功的等待线程退出。在线程结束时调用_endthreadex会释放所有资源除了线程句柄。不调用不会释放。


AfxBeginThread
不要在MFC程序中使用_beginThreadex,是因为前者是MFC封装的启动线程函数,里面包含了很多和MFC相关的启动信息,而且封装了一些常用的操作,使用起来也比较方便。另外_beginThreadex,还需要程序员对类型,安全性检查进行更多的思考。

posted on 2012-06-20 11:14  MR赵  阅读(541)  评论(0编辑  收藏  举报

导航