線程資源:線程ID,一組寄存器,棧,調度優先級和策略,信號屏蔽字,errno變量,線程私有數據。
進程的共享資源:進程的可執行代碼,全局內存,堆內存,棧和文件描述符
linux
int pthread_equal(pthread_t tid1, pthread_t tid2); int pthread_self();
Linux使用無符號長整形表示pthread_t
異步
int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(start_rtn(void*)), void* restrict arg);
在調用失敗後,返回錯誤碼,而不是設置errno
函數
若是進程中任意線程調用了exit、_Exit或者_exit,那麼整個進程就會終止。
單個線程能夠經過3種方式退出,所以能夠在不終止整個進程的狀況下,中止它的控制流:
spa
線程能夠簡單地從啓動例程中返回,返回值是線程的退出碼
操作系統
線程能夠被同一進程中的其餘線程取消
線程
線程調用pthread_exit
指針
void pthread_exit(void *rval_ptr);
int pthread_join(pthread_t thread,void **rval_ptr);
調用pthread_join後,調用線程將一直阻塞,直到指定的線程退出。利用rval_ptr_ptr 訪問 rval_ptr
rest
int pthread_cancel(pthread_t tid);
線程能夠經過調用pthread_cancel函數來請求取消同一進程中的其餘進程。
pthread_cancel並不等待線程終止,它僅僅提出請求,線程能夠選擇
忽略取消或者控制如何被取消。
code
void pthread_cleanup_push(void (*rtn)(void *),void *arg); void pthread_cleanup_pop(int execute);
1 .線程能夠安排它退出時須要調用的函數,這與進程在退出時能夠用atexit函數安排退出時相似的。
2. 若是線程是經過從它的啓動例程中退出返回而終止的話,它的清理處理程序就不會被調用。
3. rtn函數並非只有在線程結束時,纔會被調用。參看第四條
4. 若是pthread_cleanup_pop被調用且execute參數設置爲非0,則[調用並刪除]上次pthread_cleanup_push調用創建的清理處理程序。若是execute參數爲0,則清理函數將不被調用(只刪除)。
進程
線程的分離狀態屬性
PTHREAD_CREATE_DETACHED
PTHREAD_CREATE_JOINABLE (默認)
線程棧的最低地址
線程棧的大小
線程棧末尾的警惕緩衝區大小
可取消狀態
PTHREAD_CANCEL_ENABLE(默認)
PTHREAD_CANCEL_DISABLE
可取消類型
PTHREAD_CANCEL_DEFERRED(默認)
PTHREAD_CANCEL_ASYNCHRONOUS
int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate); int pthread_attr_getdetachstate(pthread_attr_t *attr, int *detachstate);
若是不想了解現有某個線程的終止狀態,可使用pthread_detach函數讓操做系統在線程退出時候收回它所佔用的資源。
建立線程時候能夠修改pthread_attr_t結構中的detachstate線程屬性,讓線程以分離狀態啓動。
detatchstate值:
PTHREAD_CREATE_DETACHED: 分離狀態啓動
PTHREAD_CREATE_JOINABLE 正常啓動,應用程序能夠獲取線程的終止狀態
int pthread_attr_setstack(pthread_attr_t *attr,void *stackaddr, size_t stacksize); int pthread_attr_getstack(pthread_attr_t *attr,void **stackaddr, size_t *stacksize);
儘可能使用 pthread_attr_setstacksize, 除非線程對棧的地址空間有特殊要求
int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize); int pthread_attr_getstacksize(pthread_attr_t *attr, size_t *stacksize);
linux3.2.0 線程的默認棧空間爲8MB,能夠設定的最小棧空間爲16KB
int pthread_attr_setguardsize(pthread_attr_t *attr, size_t guardsize); int pthread_attr_getguardsize(pthread_attr_t *attr, size_t *guardsize);
1. guardsize控制着線程棧末尾以後用以免棧溢出的擴展內存的大小。當棧指針溢出到警惕區時,應用程序接受到出錯信息
2. 若利用pthread_attr_setstack,系統認爲咱們將本身管理棧,進而使棧警惕緩衝區機制無效,至關於guardsize等於0
3. linux guardsize的默認大小爲4KB,
int pthread_setcancelstate(int stat,int *oldstate); 若成功,返回0;不然,返回錯誤編號
1.調用該函數且stat爲PTHREAD_CANCEL_DISABLE後,取消請求處於掛起狀態。當取消狀態再次變爲PTHREAD_CANCLE_ENABLE時,
線程將在下一個取消點上對全部的取消請求進行處理。
2.pthread_cancel(tid)調用並不等待線程終止。在默認狀況下,線程tid在取消請求發出之後仍是繼續運行,直到線程達到某個取消點。
void pthread_testcancel(void); 能夠調用pthread_testcancel函數在程序中添加本身的取消點
int pthread_setcanceltype(int type,int *oldtype);
type參數能夠是PTHREAD_CANCEL_DEFERRED(默認),也能夠是PTHREAD_CANCEL_ASYNCHRONOUS(異步取消)。
若是使用異步取消。線程能夠在任意時間撤銷(linux上通常接收到信號便結束),而不是遇到取消點才能被取消。