執行緒終止有三種方式,包括:
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迴...