執行緒的建立與退出

2021-06-06 01:34:42 字數 2173 閱讀 1251

執行緒由兩部分構成:

執行緒核心物件:作業系統用它來對執行緒實施管理。核心物件也是系統用來存放執行緒統計資訊的地方。

執行緒堆疊:它用於維護執行緒在執行**時需要的所有函式引數和區域性變數。

我們必需要知道乙個事實 ----- 程序( windows 中)是不能被排程的。通常所說的排程,都是對執行緒而言的。程序僅僅是執行緒的容器,是系統統分配資源的單位。 這樣,執行緒自身不會分配資源。同一程序中的多個執行緒共同使用它們父程序的資源。

在 vc 環境中,我們可以呼叫 creatthread 來建立乙個執行緒。關於用法請查 msdn

我們應該主要關注這個 api 的呼叫,作業系統會幹哪些事情。而不是僅僅會使用這個 api 。

當程式啟動的時候,系統會建立乙個程序,進而會為這個程序建立乙個主線程。主線程即是乙個程式的入口。 c/c++ 執行期庫會初始化全域性的 c/c++ 變數,然後呼叫入口點函式(如 main )。然後初始化執行緒堆疊,建立臨時變數等。

當執行緒結束時會按以下操作執行。

2、      作業系統將正確地釋放執行緒堆疊使用的記憶體。

3、      系統將執行緒退出**設定為執行緒函式的返回值。

4、      系統將遞減執行緒核心物件的引用計數。

因此,正確的執行緒退出方式是必不可少的。 最好的退出執行緒的方法是讓執行緒函式返回,這樣 c/c++ 執行期庫便能正確地撤消 c/c++ 物件。 值一說的是,不管執行緒怎麼退出,當乙個程式結束時,系統總是回清除他使用了的系統資源,如核心物件等。但 c/c+= 執行期庫申請的資源則不會被釋放。

像 exitthread 等函式,需要三思而用。

眾所周知,建立執行緒的時候,必不可少的兩個引數就是執行緒入口函式和函式引數。那這兩個是怎麼工作的呢。請看如下分析。

首先要知道,每個執行緒都有自己的一組 cpu 暫存器。這組暫存器的所有資訊就是我們所說的執行緒上下文。當系統進行時間片輪轉執行執行緒的時候,會將前乙個執行緒的所有暫存器值儲存,然後將下乙個需要執行的執行緒的暫存器值裝入 cpu 暫存器,進而執行。重複這樣的操作,就達到了多執行緒執行的效果。當然,實際情況是很複雜的。需要許多的判斷,在多處理器計算機中,還需要考慮執行緒的親緣性等。

話不多說,回頭來看這個執行緒函式的執行方式。

當乙個執行緒被建立時,系統便會建立執行緒的核心物件。並分配執行緒堆疊需要的記憶體。這個記憶體是從程序的位址空間分配而來的,因為我們知道,執行緒不持有資源。當一切都做好後,便是填寫資料了。

系統首先會把執行緒的引數和入口位址壓入執行緒堆疊。 注意,是先壓的引數,再壓的入口位址。這樣入口位址是在棧頂。此時 sp 的值即為函式入口位址。 而將 ip 設定為另乙個函式。它叫 void basethreadstart(); 很神奇吧,為什麼 ip 並不是執行緒的入口函式位址呢。 我們直接可以猜到, void basethreadstart(); 所做的工作中,會呼叫到我們的執行緒入口函式。接下來我們看看 void basethreadstart(); 函式幹了些什麼。

void basethreadstart(pthread_start_routine pfnstartaddr,pvoid pvparam)

__except(unhandedexceptionfilter(getexceptioninformation())

}

還記得我們壓棧的時候是先壓的引數再壓的執行緒函式入口位址麼。這就對了,上面即是這樣的情況。 可以看出, basethreadstart 函式不會馬上返回,他會等待執行緒結束後返回。由於執行緒和程序共用的程序記憶體空間,可以知道。如果執行緒函式沒有退出 basethreadstart 就返回,可以肯定的會引發訪問違規。因為執行緒未退出時,執行緒堆疊並未清除。 basethreadstart 返回時,從堆疊上得到的返回位址是乙個不可**的值。 程序在初始化時也會是類似執行方式。因為程序執行時,啟動的是乙個主線程,而不是由程序本身來執行**。

最後說明,當新執行緒執行 basethreadstart 函式時,將會出現如下情況:

2、      系統呼叫執行緒函式,並將你傳遞的引數傳遞給它。

3、      當執行緒函式返回時, basethreadstart 呼叫 exithread ,並將執行緒函式的返回值傳遞給它。該執行緒核心物件的使用計數減 1 ,執行緒停止執行。

4、      如果執行緒產生乙個沒有處理的異常條件,由 basethreadstart 建立的 she 將負責處理該異常。由上面可以看出,它呼叫 exitprocess 退出整個程序。

執行緒建立等待及退出

1.linux上線程開發api概要 多執行緒開發在 linux 平台上已經有成熟的 pthread 庫支援,在程式執行的時候要假如 lpthread 其涉及的多執行緒開發的最基本概念主要包含三點 執行緒,互斥鎖,條件。其中,執行緒操作又分執行緒的建立,退出,等待 3 種。互斥鎖則包括 4 種操作,分...

執行緒中建立新執行緒,退出機制

執行緒中建立新執行緒,退出機制 程式 include include include include pthread t son t 0 void cleanup void 這一句是找出本程序的所有執行緒.printf clean n void son cleanup void void test ...

Linux 多執行緒之執行緒的建立和退出

include apue.h 1.main函式的執行緒稱為初始執行緒或主線程,主線程在main函式返回的時候,會導致 整個程序結束。可以在主線程中使用pthread exit函式 退出主線程 如此,程序會等待所有的執行緒結束時候才終止 struct person void thread fun vo...