阻塞等待執行緒退出,獲取執行緒退出狀態
其作用,對應程序中的waitpid()函式
int
pthread_join
(pthread_t thread,
void
**retval)
;
返回值:成功:0;失敗:錯誤號
引數: thread:執行緒id【注意】不是指標
retval:儲存執行緒結束狀態
【對比記憶】
程序中:main返回值(return xx)、exit引數均為int型值;等待子程序結束時可以用wait函式獲取程序結束狀態 wait函式的引數為int*
執行緒中:執行緒主函式返回值、pthread_exit的引數為void*;那麼等待執行緒結束的pthread_join函式引數為void**
【練習】引數retval非空用法
呼叫該函式的執行緒將掛起等待,直到id為thread的執行緒終止。thread執行緒以不同的方式終止,通過pthread_join得到的終止狀態是不同的
(1)子執行緒通過pthread_exit退出
(2)子執行緒通過return退出
(3) 子執行緒返回乙個自定義的結構體
【總結】
(1)如果子執行緒通過pthread_exit退出,那麼retval所指向的單元裡存放的是傳給pthread_exit的引數
(2)如果子執行緒通過return退出,那麼retval所指向的單元裡存放的是子執行緒函式的返回值
(3)如果子執行緒被別的執行緒呼叫pthread_cancel異常終止掉,retval所指向的單元裡存放的是常數pthread_canceled
(4)如果對子執行緒的終止狀態不感興趣,可以傳null給retval引數
(5)乙個執行緒建立後,最好用pthread_join**該執行緒,避免產生殭屍執行緒
【練習】**多個子執行緒
實現執行緒分離
讓我們將pthread_detach函式注釋,再執行
【結果分析】從子執行緒的退出碼為1可以看出pthread_join函式是執行成功的。
【總結】一般情況下,執行緒終止後,其終止狀態一直保留到其他執行緒呼叫pthread_join獲取它的狀態為止,但是執行緒也可以被置為detach狀態,這樣執行緒一旦終止就立刻**它占用的所有資源,而不保留終止狀態(不需要主線程呼叫pthread_join來**它)。不能對乙個已經處於detach狀態的執行緒呼叫pthread_join,這樣的呼叫將返回einval錯誤。也就是說,如果對乙個執行緒呼叫了pthread_detach就不能再呼叫pthread_join
殺死(取消)執行緒 其作用:對應程序中的kill()函式
int
pthread_cancel
(pthread_t thread)
; 成功:0;失敗:錯誤號
【注意】執行緒的取消並不是實時的,而有一定的延時,需要等待執行緒到達某個取消點(檢查點)
【取消點】是執行緒檢查是否被取消,並按請求僅從動作的乙個位置,通常是一些系統呼叫(create,open,pause,close,read,write……)凡有阻塞作有的posix c函式都會有取消點, (具體包括哪些,可以檢視man 7 pthreads
// printf("aaa\n"); //可作取消點 凡有阻塞作有的posix c函式都會有取消點, (具體包括哪些,可以檢視man 7 pthreads)
// pthread_testcancel(); //可作取消點 //如果遮蔽所有的取消點.主程式就會堵在pthread_join裡.
// printf("bbb\n");//可作取消點
// printf("ccc\n");//可作取消點
// sleep(5);//可作取消點
// printf("ddd\n");//可作取消點
// pthread_testcancel();//可作取消點
// system("ls");//可作取消點
比較兩個執行緒id是否相等
int
pthread_equal
(pthread_t t1, pthread_t t2)
;
程序執行緒
建立fork()
pthread_create
退出exit(int)
pthread_exit(void*)
等待wait(int*)
pthread_join(thread, void**) 阻塞等待
殺死kill
pthread_cancel 取消點(man 7 pthreads)
獲取id
getpid
pthread_self()分離無
pthread_detach() 自動清理pcb
系統程式設計之執行緒
pthread t tid 建立執行緒號,多個執行緒可以用陣列來實現,如pthread t tid 3 函式原型 int pthread create pthread t tid,const pthread attr t restrict attr,void start rtn void void ...
Linux系統程式設計之執行緒條件變數
include include include include pthread cond t cond pthread cond initializer 初始化條件變數 pthread mutex t mutex pthread mutex initializer 靜態初始化互斥鎖 struct m...
Linux系統程式設計 執行緒函式(二)
今天我們編寫乙個程式來實現執行緒有關的函式 本程式使用了下兩個執行緒相關的函式 1 pthread join函式 2 pthread detach函式 這兩個函式的詳細用法在前面的部落格中介紹過了,這裡就不介紹了。實現 include include include include include ...