_beginthreadex 一定要自己写 CloseHandle 可以不用 _endthreadex
_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
標簽:_beginthreadex談 到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.
總結
以上是生活随笔為你收集整理的_beginthreadex 一定要自己写 CloseHandle 可以不用 _endthreadex的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 利用ACS来实现AAA服务
- 下一篇: 图解Cisco Packet Trace