Linux系統程式設計之執行緒 二 下

2021-10-23 08:45:28 字數 2687 閱讀 8958

阻塞等待執行緒退出,獲取執行緒退出狀態

其作用,對應程序中的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 ...