Windows核心之線程簡單介紹

來源:互聯網
上載者:User

標籤:包含   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核心之線程簡單介紹

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.