執行緒終止 等待 分離的方式講解

2021-12-30 03:41:13 字數 2133 閱讀 5307

執行緒終止有三種方式,包括:

1.從執行緒函式return(對主線程不可使用),從main函式return相當於呼叫exit。

2.執行緒可以呼叫pthread_exit終止自己。

3.乙個執行緒可以呼叫pthread_cancel終止同一程序中的另外乙個執行緒。

我們來認識幾個函式:

pthread_exit函式

用來終止程序,引數是void*型別,無返回值。

注意:return和pthread_exit返回的指標所指向的記憶體單元必須是全域性的或者是malloc分配的,因為執行緒棧是私有的,當其他執行緒的得到這個函式的時候,該執行緒已經退出。

pthread_cancel函式

用來取消乙個執行中的程序,成功返回0,失敗返回錯誤碼。

執行緒取消返回pthread_canceled,是乙個巨集。

這個巨集具體是什麼呢?我們查詢後發現是將-1轉化為(void*)型別返回。

執行緒退出只有兩種情況;

1.**跑完,結果正確;

2.**跑完,結果錯誤。

注意:和程序不同的是執行緒退出不包括執行緒異常退出,不會因為乙個執行緒異常等待,只要有乙個執行緒異常,主線程直接掛,不會等待。

為什麼需要執行緒等待?

在學習程序時,我們說過父程序通過wait函式或waitpid函式等待子程序,**子程序的資源,獲取子程序的退出資訊,如果父程序沒有等待,則會造成殭屍程序,子程序的描述符仍然儲存在系統中。

執行緒也是一樣的,如果不等待,則會造成類似殭屍執行緒的狀況。已經退出的執行緒,其空間沒有被釋放,仍然在程序的位址空間內,建立的新執行緒不會復用剛才退出執行緒的位址空間。

**實現:

1.執行緒的狀態分為兩種:可結合的(joinable)和分離的(detached),其中預設情況下新建立的執行緒是可結合的。

2.執行緒退出後,需要對其進行pthread_join操作,否則無法釋放資源,從而造成系統洩露。若將執行緒分離,則該執行緒是不需要join的(即不能被其他執行緒**其資源和殺死),執行完畢後,系統會自動**。

3.執行緒分離可以是主線程將其分離,也可以是執行緒自己將自己分離。

4.若分離的執行緒異常,程序也會終止。因為執行緒分離是指資源層面上的分離,分離特性僅僅基於不出問題的情況。

我們來認識幾個函式:

pthread_detach函式

用於分離乙個執行緒,分離成功返回0,分離失敗返回錯誤碼。

**實現執行緒分離

由結果可知,將建立的執行緒分離出去後,就不需要join了。

也可以建立出多個執行緒,用其他執行緒對該執行緒程序分離。如下:

#include

#include

#include

#include

#include

void *func1(void *arg)

void *func2(void *arg)

int main()

else

if(pthread_join(tid2, null) == 0)else

return 0;

}

分離執行緒可以自己將自己分離,也可以其他執行緒對目標執行緒進行分離。分離後的執行緒不需要主線程等待,執行完後系統會對其程序**。而可結合的執行緒需要主線程程序等待,對該程序進行資源釋放。

執行緒終止 等待 分離

執行緒終止有三種方式,包括 1.從執行緒函式return 對主線程不可使用 從main函式return相當於呼叫exit。2.執行緒可以呼叫pthread exit終止自己。3.乙個執行緒可以呼叫pthread cancel終止同一程序中的另外乙個執行緒。我們來認識幾個函式 pthread exit...

執行緒的控制(建立,終止,等待,分離)

功能 建立乙個新的執行緒 原型 int pthread create pthread t thread,const pthread attr t attr,void start routine void void arg 引數 thread 返回執行緒id attr 設定執行緒的屬性,attr為nu...

Java等待執行緒池終止

1 輪詢isterminated while service.isterminated 2 輪詢awaittermination while service.awaittermination 1,timeunit.seconds service表示執行緒池物件,當執行緒池終止時將自動跳出while迴...