clq

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

_beginthreadex 一定要自己写 CloseHandle 可以不用 _endthreadex

 

天哪,好久不 写忘记了.一直记得线程的句柄只是 createthread 才需要关闭,可能是我用 AfxBeginThread 太多了.

以后直接这样好了 ::CloseHandle((HANDLE)_beginthreadex(NULL, 0,threadRun_client,(void *)tp, 0, &runThreadID ));

--------------------------------------------------

http://wellwy.blog.51cto.com/blog/1609602/492009

 

_beginthreadex相关的东东 2011-02-12 16:57:52

谈 到Handle的问题,_beginthread的对应函数_endthread自动的调用了CloseHandle,而_beginthreadex的 对应函数_endthreadex则没有,所以CloseHandle无论如何都是要调用的不过_endthread可以帮你执行自己不必写,其他两种就 需要自己写!(Jeffrey   Richter强烈推荐尽量不用显式的终止函数,用自然退出的方式,自然退出当然就一定要自己写CloseHandle) 


 

 
//////////////////////////////

在Windows下面,比较常见的多线程创建函数是CreateThread(Windows自带的)和_beginthread、_beginthreadex(C运行库的)。

强烈推荐只用_beginthreadex,参数上面与CreateThread基本一样,比CreateThread好的就是,它给每个线程维护一个tiddata数据块,这对于多线程环境非常重要。《Windows核心编程》里也是这么说的。

用_beginthreadex还有个好处是,线程结束后,不会自己执行CloseHandle函数,这样的话,对于WaitFor系列函数的调用就比较方便了。_beginthread在线程结束的时候是会自己CloseHandle。


 

//////////////////////////

_beginthread()存在几个缺陷如下: 

1     创建时不能将线程挂起。 
2     _beginthread产生出来的线程会首先关闭自己的handle,这样做是为了隐藏win32的实现细节,因此_beginthread()传回的参数可能在当时是不可用的。因此,没有这个handle,你就无法等待他结束,无法改变其参数,无法获得结束代码。 



///////////////////////////////////

You can call _endthread or _endthreadex explicitly to terminate a thread; however, _endthread or _endthreadex is called automatically when the thread returns from the routine passed as a parameter. Terminating a thread with a call to endthread or _endthreadex helps to ensure proper recovery of resources allocated for the thread.


posted on 2012-01-05 12:45  clq  阅读(2907)  评论(0编辑  收藏  举报