執行緒終止方式

2022-08-15 16:45:15 字數 1138 閱讀 5000

一般來說,posix的執行緒終止有兩種情況:正常終止和非正常終止。執行緒主動呼叫pthread_exit()或者從執行緒函式中return都將使執行緒正常退出,這是可預見的退出方式;非正常終止是執行緒在其他執行緒的干預下,或者由於自身執行出錯(比如訪問非法位址)而退出,這種退出方式是不可預見的。

一般情況下,程序中各個執行緒的執行都是相互獨立的,執行緒的終止並不會通知,也不會影響其他執行緒,終止的執行緒所占用的資源也並不會隨著執行緒的終止而得到釋放。正如程序之間可以用wait()系統呼叫來同步終止並釋放資源一樣,執行緒之間也有類似機制,那就是pthread_join()函式。

void pthread_exit(void *retval) int pthread_join(pthread_t th, void **thread_return) int pthread_detach(pthread_t th)

pthread_join()的呼叫者將掛起並等待th執行緒終止,retval是pthread_exit()呼叫者執行緒(執行緒id為th)的返回值,如果thread_return不為null,則*thread_return=retval。需要注意的是乙個執行緒僅允許唯一的乙個執行緒使用pthread_join()等待它的終止,並且被等待的執行緒應該處於可join狀態,即非detached狀態。

如果程序中的某個執行緒執行了pthread_detach(th),則th執行緒將處於detached狀態,這使得th執行緒在結束執行時自行釋放所占用的記憶體資源,同時也無法由pthread_join()同步,pthread_detach()執行之後,對th請求pthread_join()將返回錯誤。

乙個可join的執行緒所占用的記憶體僅當有執行緒對其執行了pthread_join()後才會釋放,因此為了避免記憶體洩漏,所有執行緒的終止,要麼已設為detached,要麼就需要使用pthread_join()來**。

關於pthread_exit()和return

理論上說,pthread_exit()和執行緒宿體函式退出的功能是相同的,函式結束時會在內部自動呼叫pthread_exit()來清理執行緒相關的資源。但實際上二者由於編譯器的處理有很大的不同。

在程序主函式(main())中呼叫pthread_exit(),只會使主函式所在的執行緒(可以說是程序的主線程)退出;而如果是return,編譯器將使其呼叫程序退出的**(如_exit()),從而導致程序及其所有執行緒結束執行。

執行緒終止方式

如果需要只終止某個執行緒而不終止整個執行緒,可以有三種方法 a 從主線程函式 return.從別的函式裡return會回到主線程,而不會直接把整個執行緒結束 這種方法對主控執行緒不適合,從 main 函式return 相當於呼叫 exit.b 乙個執行緒可以呼叫 pthread cancel 終止同...

多執行緒系列(四) 終止執行緒的方式

多執行緒系列 一 執行緒的狀態及轉換 多執行緒系列 二 執行緒的建立方式 多執行緒系列 三 執行緒常用方法 多執行緒系列 四 終止執行緒的方式 多執行緒系列 五 死鎖案例以及檢測方法 多執行緒系列 六 生產者消費者案例 多執行緒系列 七 synchronized關鍵字簡單使用以及可重入性 多執行緒系...

09之 interrupt 和執行緒終止方式

interrupt 是給執行緒設定中斷標誌 interrupted 是檢測中斷並清除中斷狀態 isinterrupted 只檢測中斷。還有重要的一點就是interrupted 作用於當前執行緒,interrupt 和isinterrupted 作用於此執行緒,即 中呼叫此方法的例項所代表的執行緒。首...