x線程-啟動與銷毀


當一個線程啟動時,會做什么操作:
1.創建內核對象
2.使用計數
3.ExitCode
4.Signaled
5.Context 線程上下文-----存儲了CPU的當前狀態---IP(指令寄存器)\SP(棧寄存器)
6.線程去進程當中申請一塊內存,作為當前線程的棧
6.線程將lParam、lpStarAddress(線程的入口函數(RtUserThreadStart))存入棧中

Createthread()

_beginthreadex()--_endthread() 推薦使用此函數

注意:
_endthread 會自動關閉線程句柄。 (該行為與 Win32 ExitThread API 不同。)因此,當你使用 _beginthread 和 _endthread 時,請不要通過調用 Win32 CloseHandle API 來顯式關閉線程句柄。

與 Win32 ExitThread API 相同,_endthreadex 不會關閉線程句柄。 因此,當你使用 _beginthreadex 和 _endthreadex 時,必須通過調用 Win32 CloseHandle API 來關閉線程句柄。

_endthread 和 _endthreadex 會導致 C++ 析構函數在不會調用的線程中處於掛起狀態

兩者的區別:
beginthreadex是一個C運行時庫的函數,CreateThread是一個系統API函 數,_beginthreadex內部調用了CreateThread。為什么要有兩個呢?因為C 運行庫里面有一些函數使用了全局量,如果使用CreateThread 的情況下使用這些C 運行庫的函數,就會出現不安全的問題。而 _beginthreadex 為這些全局變量做了處理,使得每個線程都有一份獨立的“全局”量。


當一個進程銷毀時,會做什么操作:
1.銷毀臨時對象
2.釋放堆棧
3.將返回值設置為我的退出代碼
4.減少進程內核對象的使用計數。

同理,當一個線程銷毀時,會做什么操作:
1.銷毀臨時對象,調用析構函數
2.釋放線程里面所分配的堆棧 -》窗口對象 HOOK(線程級別),其他都是進程級別
3.將返回值設置為我的退出代碼,線程的入口函數的返回值設置為我的退出代碼
4.減少線程內核對象的使用計數。

ExitThread() 立即結束當前線程
直接退出線程,同時會將當前線程的棧銷毀,但不會調用析構函數。結果造成內存泄漏。
比如:在構造函數中new內存,但沒調用析構函數,即該內存沒有釋放。

TerminateThread() 可以結束其他線程


配套使用方法:
第一種:
Createthread()
ExitThread()
CloseHandle()
第二種:
_beginthreadex()
_endthread()
第三種:
_beginthreadex()
_endthreadex()
CloseHandle()

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com