1. 程式人生 > >【Linux 執行緒】常用執行緒函式複習《三》

【Linux 執行緒】常用執行緒函式複習《三》

1、關於函式pthraed_join與函式pthraed_detach

在任何一個時間點上,執行緒是可結合的(joinable)或者是分離的(detached)。一個可結合的執行緒能夠被其他執行緒收回其資源和殺死。在被其他執行緒回收之前,它的儲存器資源(例如棧)是不釋放的( 執行緒獨享部分)。相反,一個分離的執行緒是 不能被其他執行緒回收或殺死的,它的儲存器資源在它終止時 由系統自動釋放。     預設情況下,執行緒被建立成可結合的。為了避免儲存器洩漏,每個可結合線程都應該要麼被顯示地回收,即呼叫pthread_join;要麼通過呼叫pthread_detach函式被分離。
  int pthread_join(pthread_t tid, void**thread_return);                                  若成功則返回0,若出錯則為非零。              執行緒通過呼叫pthread_join函式等待其他執行緒終止。pthread_join函式分阻塞,直到執行緒tid終止,將執行緒例程返回的(void*)指標賦值為thread_return指向的位置,然後回收已終止執行緒佔用的所有儲存器資源。 [cpp] int pthread_detach(pthread_t tid);                                  若成功則返回0,若出錯則為非零。pthread_detach用於分離可結合線程tid。執行緒能夠通過以pthread_self()為引數的pthread_detach呼叫來分離它們自己。       如果一個可結合線程結束執行但沒有被join,則它的狀態類似於程序中的Zombie Process,即還有一部分資源沒有被回收,所以建立執行緒者應該呼叫pthread_join來等待執行緒執行結束,並可得到執行緒的退出程式碼,回收其資源。     由於呼叫pthread_join後,如果該執行緒沒有執行結束,呼叫者會被阻塞,在有些情況下我們並不希望如此。例如,在Web伺服器中當主執行緒為每個新來的連線請求建立一個子執行緒進行處理的時候,主執行緒並不希望因為呼叫pthread_join而阻塞(因為還要繼續處理之後到來的連線請求)
,這時可以在 子執行緒中加入程式碼     pthread_detach(pthread_self()) 或者父執行緒呼叫     pthread_detach(thread_id)(非阻塞,可立即返回) 這將該子執行緒的狀態設定為分離的(detached),如此一來,該執行緒執行結束後會自動釋放所有資源。   轉載自:http://www.hack6.com/html/bc/C/20141106/52232.html   2、程序控制原語與執行緒控制原語的大致對應關係
執行緒控制原語                                   程序控制原語
pthread_create()                                fork()
pthread_self()                                  getpid()
pthread_exit()                                  exit()                 
return pthread_join() wait()/waitpid() pthread_cancel() kill() pthread_detach()