咱們能夠將線程看做爲一個依託於進程存在的獨立邏輯流,它擁有着獨立的線程ID,一組寄存器,棧,調度優先級和策略,信號屏蔽字,errno變量以及線程私有數據.
同時,進程的全部信息對全部線程共享,包括可執行程序的代碼,程序的全局內存和堆內存以及文件描述符.
關於全部線程共享進程堆內存的問題我查閱了一些資料.某些blog上說線程在共享堆內存的時候內核是對內存作了同步處理以及讀寫保護,因此全部的線程共享一個堆也是安全的.
這個問題暫時寫在前面,等我翻閱一些資料以後再嘗試着解釋線程共享堆的機制.安全
線程標識:就像每一個進程都有一個進程ID同樣,每一個線程都有一個線程ID,線程ID只有在所屬進程的上下文中才有意義.
線程ID是用pthread_t數據類型來表示的,考慮到可移植性問題,咱們使用一個函數對兩個線程ID進行比較:函數
#include<pthread.h> int pthread_equal(pthread_t tid1, pthread_t tid2) //返回值:若相等則返回非0,不然返回0. pthread_t pthread_self(void) //返回值:調用線程的線程ID
函數原型:線程
#include<pthread.h> int pthread_create(pthread_t *restrict tidp, const pthread_attr_t * restrict attr, void *(*start_rtn) (void *) void *restrict arg); //成功則返回0,不然返回錯誤編號.
參數start_rtn:新建立的線程從start_rtn函數地址開始運行,若是須要向函數傳遞參數,那麼須要把這些參數放入一個結構中,而後把結構的地址做爲arg參數傳入.指針
函數原型:rest
#include<pthread.h> void pthread_exit(void *rval_ptr)
rval_ptr參數:無類型指針,做爲線程結束的返回值.code
當咱們但願阻塞住並等待某個線程終止的時候能夠用pthread_joinblog
#include<pthread.h> int pthread_join(pthread_t thread, void **rval_ptr) //成功則返回0,不然返回錯誤編號.
若是線程被取消,則rval_ptr參數則爲PTHREAD_CANCELED進程
須要注意的是,當調用exit的時候,咱們傳入的參數能夠是一個複雜結構的指針.同時,這個結構所使用的內存最好在分配在堆上,由於當線程結束時該結構可能已經被釋放.內存
函數原型:資源
#include<pthread.h> int pthread_detach(pthread_t thread) //成功則返回0,不然返回錯誤編號.
調用了pthread_detach函數的線程在終止後存儲器資源會被當即收回
函數原型:
#include<pthread.h> int pthread_cancel(pthread_t tid); //成功返回0,失敗則返回錯誤碼
目標線程能夠選擇忽略取消或者控制如何被取消,cancel函數並不等待線程終止,而是僅僅提出請求.
函數原型:
#include<pthread.h> void pthread_cleanup_push(void (*rtn) (void *), void *arg) void pthread_cleanup_pop(int execute)