標籤:包含 argument begin 狀態 地方 相同 ram res 傳遞
1 線程定義
<1> 核心對象,作業系統用它來對線程實施管理。核心對象也是系統用來存放線程統計資訊的地方
<2>還有一個是線程堆棧。它用於維護線程在運行代碼時須要的全部函數參數和局部變數.
2 線程和進程的差別
<1>進程是不活潑的。
進程從來不運行不論什麼東西。它僅僅是線程的容器。
<2>線程在它的進程地址空間中運行代碼,而且在進程的地址空間中對資料進行操作。
<3>線程共用進程的地址控制項
<4>線程僅僅有一個核心對象和一個堆棧,保留的記錄非常少,開銷比進程少非常多。
3 線程函數
線程分為主線程以及一般線程。主線程的進入點函數必須是main。wmain,WinMain。wWinMain。一般線程函數則能夠隨便命名。而且必需要有一個函數傳回值。
4 建立線程
HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD SIZE_T dwStackSize, // initial stack size LPTHREAD_START_ROUTINE lpStartAddress, // thread function LPVOID lpParameter, // thread argument DWORD dwCreationFlags, // creation option LPDWORD lpThreadId // thread identifier);
<1>lpThreadAttributes
指向一個SECURITY_ATTRIBUTES的指標。指定安全屬性,當為NULL的時候,會利用系統預設的安全屬性
<2> dwStackSize
設定線程棧的初始大小,以位元組為單位,系統會把它四捨五入到頁面大小的近期值,當設定為NULL 的時候,會採取系統的預設值。
<3> lpParameter
指嚮應用程式定義的LPTHREAD_START_ROUTINE類型的函數的指標。這個函數將有新線程運行,表示線程的新的起始地址。指定一個函數做位新線程的入口地址,函數的名稱隨意,可是類型必須依照以下的格式:
DWROD WINAPI ThreadProc(LPVOID lpParameter);
<4> lpParameter
傳遞給線程的參數
<5> dwCreationFlags
設定用於線程建立的附加標記。是CREATE_SUSPENDED或者0兩者之中的一個,假設是CREATE_SUSPENDED表示線程不馬上運行。知道ResumeThread函數開始運行。
<6> lpThreadId
這是一個傳回值,用於表示函數的線程ID。
系統給線程分配的堆棧是從進程的地址空間中分配的,全部線程共用進程地址空間。他們之間通訊非常方便。
注意:CreateThread是Windows函數,假設要編寫C/C++的多線程函數,那麼就須要使用_beginTreadx函數
5 線程的終止執行
<1>線程函數的返回
<2>通過ExitThread函數撤銷線程,只是最好不用
<3>同一個進程或者還有一個進程中的線程調用TerminateThread函數,應該避免用
<4>包括線程的進程的終止執行,應該避免用
5.1 線程函數返回時做的事情
<1>線上程函數中建立的全部C + +對象均將通過它們的撤消函數正確地撤消
<2>作業系統將正確地釋放線程堆棧使用的記憶體
<3>系統將線程的結束代碼(線上程的核心對象中維護)設定為線程函數的傳回值
<4>系統將遞減線程核心對象的使用計數
5.2 ExitThread 函數
它可以使作業系統清除全部的作業系統資源,包含線程的堆棧,可是C++資源將不會被撤銷
5.3 TerminateThread 函數
這個函數可以停止不論什麼線程,可是它不會發送不論什麼通知訊息給將要撤銷的線程。而且它是非同步。不能保證函數返回的時候,函數線程已經被終止。
在進程終止前,線程的堆棧是不會被清除的,這樣方便其它線程使用。
5.4 進程終止時線程的終止
相同的問題是進程強制終止,會造成
5.5 線程終止時候發生的事情
<1>線程的結束代碼從S T I L L _ A C T I V E改為傳遞給E x i t T h r e a d或Te r m i n a t e T h r e a d的代碼
<2>線程核心對象的狀態變為已通知
<3>假設線程是進程中最後一個活動線程。系統也將進程視為已經終止執行
<4>線程核心對象的使用計數遞減1
注意:通過檢查線程控制代碼的推出去代碼能夠檢查線程是否已經終止。
響應的函數是:
BOOL GetExitCodeThread(HANDLE hThread,LPDWORD lpDword)
Windows核心之線程簡單介紹