當主線程先於其它進程執行 pthread_exit() 時,進程還不會退出,只有最後一個線程也完成了,進程纔會退出。執行exit()或者在主線程執行return,會當即終止進程的執行。函數
pthread_create()的第四個形參是線程函數的形參
spa
一個可「join」的線程所佔用的內存僅當有線程對其執行立pthread_join()後纔會釋放,所以爲了不內存泄漏,全部線程的終止時,要麼已被設爲DETACHED,要麼使用pthread_join()來回收資源。線程
一個線程不能被多個線程等待,不然第一個接受到信號的線程成功返回,其他調用pthread_join()的線程返回錯誤代碼ESRCH指針
void pthread_exit(void* retval); int pthread_join(pthread_t thread, void **retval);
pthread_join()參數 retval 的做用是爲指向線程的返回值的指針提供一個位置, 這個返回值是目標線程調用 pthread_exit()或者 return 後所返回的值。當目標線程無需返回時可以使用 NULL 值,調用線程若是不需對目標線程的返回狀態進行檢查可直接將 retval 賦值爲 NULL。code
能夠分爲分離線程(DETACHED)和非分離線程(JOINABLE)兩種:對象
分離線程是退出時會釋放它的資源的線程;blog
非分離線程退出後不會當即釋放資源,須要另外一個線程爲它調用 pthread_join 函數或者進程退出時纔會釋放資源。進程
只有非分離線程纔是可鏈接的,分離線程退出時不會報告它的退出狀態。
內存
每一個線程都有一個獨立的調用棧,線程的棧大小在線程建立的時候就已經固定下來,Linux 系統線程的默認棧大小爲 8MB,只有主線程的棧大小會在運行過程當中自動增加。用戶能夠經過屬性對象來設置和獲取棧大小。
資源
int pthread_detach(pthread_t thread);
pthread_t pthread_self(void);
int pthread_equal(pthread_t t1, pthread_t t2);
int pthread_attr_init(pthread_attr_t *attr);
int pthread_attr_destroy(pthread_attr_t *attr);
int pthread_attr_getdetachstate(pthread_attr_t *attr, int *detachstate);
int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
int pthread_attr_getstacksize(pthread_attr_t *attr, size_t *stacksize);
int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);