各線程共享的資源:
1、文件描述符表。
2、每種信號的處理方式(SIG_IGN、SIG_DFL或者自定義的信號處理函數)
3、當前工作目錄。
4、用戶id和組id。
各線程獨立的資源:
1、線程id。
2、上下文,包括各種寄存器的值、程序計算器和棧指針。
3、棧空間。
4、errno變量。
5、信號量屏蔽字。
6、調度優先級。
如果任意一個線程調用了exit或_exit,則整個線程的所有線程都終止。
終止線程:
1、從線程函數return,這種方法對主線程不適用,從main函數return相當於調用exit。
2、一個線程可以調用pthread_cancel終止同一進程中的另一個線程。
3、線程可以調用pthread_exit終止自己。
線程等待:
1、如果thread線程通過return返回,value_ptr所指向的單元裏存放的是thread線程函數返回值。
2、如果thread線程被別的線程調用pthread_cancel異常終止掉,value_ptr所指向的單元存放的是常數PTHREAD_CANCELED。
3、如果thread線程是自己調用pthread_exit終止的,value_ptr所指向的單元裏存放的是傳給pthread_exit的參數。如果對thread線程的終止狀態不感興趣,可以傳NULL給value_ptr參數。
線程分離:
在任何一個時間點上,線程是可結合的或者是分離的。一個可結合的線程能夠被其他線程收回其資源和殺死。在被其他線程回收之前,它的存儲器資源是不釋放的。相反,一個分離的線程是不能被其他線程回收或殺死的,它的存儲器資源在它終止時由系統自動釋放。
默認情況下,線程被創建成可結合的。爲了避免存儲器泄漏,每個可結合線程都應該要被顯示地回收,即調用pthread_join;要麼通過調用pthread_detach函數被分離。
如果一個可結合線程結束運行但沒有被join,則它的狀態類似於進程中的殭屍進程,即還有一部分資源沒有被回收,所以創建線程者應該調用pthrea_join來等待線程運行結束,並可得到線程的退出碼,回收其資源。
由於調用pthread_join後,如果該線程沒有運行結束,調用者會被阻塞,在有些情況下我們並不希望如此。例如,在Web服務器中當主線程爲每個新來的連接請求創建一個子線程進行處理的時候,主線程並不希望因爲調用pthread_join而阻塞(因爲還要繼續處理之後到來的連接請求),這時可以在子線程中加入代碼pthread_detach(pathread_self()或者父線程調用pthread_detach(thread_id)(非阻塞,可立即返回)
這將子線程的狀態設置爲分離的,如此一來,該線程運行結束後自動釋放所有資源。