線程概念
典型的unix進程可以看成只有一個控制線程:一個進程只能做一件事。加入多線程後,一個進程能夠做不止一件事,每個線程處理各自的獨立任務。多線程的好處是:
- 通過爲每件事件類型分配單獨的處理線程,可以簡化處理異步事件的代碼。
- 多個進程必須使用系統提供的複雜機制才能實現內存和文件描述符的共享,而多個線程自動地可以訪問相同的存儲地址空間和文件描述符。
- 有些問題可以分解從而提高整個系統的吞吐量。
交互的程序同樣可以通過使用多線程來改善響應時間,多線程可以把程序中處理用戶輸入輸出的部分與其他部分分開
每個線程都包含表示執行環境所必需的信息,其中包括表示線程的線程ID,一組寄存器值,棧,調度優先級和策略,信號屏蔽字,errno變量以及線程私有數據。
一個進程的所有信息對該進程的所有線程都是共享的,包括可執行程序代碼,程序的全局內存和堆內存,棧以及文件描述符。
線程標識
線程ID在它所屬的進程上下文中才有意義,用pthread_t數據類型來表示,實現是通過一個結構來表示的,所以不能把它當作整數處理。
//比較兩個線程ID
int pthread_equal(pthread_t tid1, pthread_t tid2);
返回值:相等,返回非0值;否則返回0
線程可以通過調用pthread_self函數獲得自身的線程ID
pthread_t pthread_self(void);
線程創建
線程的創建通過pthread_create函數創建
int pthread_create(pthread_t* restrict tidp,
const pthread_attr_t* restrict attr,
void* (*start_rtn)(void*),
void* restrict arg);
返回值:創建成功返回0;否則,返回錯誤編碼
參數:
tidp:新創建的線程ID
attr:用於定製各種不同的線程屬性,值爲NULL時,具有默認的線程屬性
start_rtn:新創建線程的開始運行地址
arg:一個無類型的參數;如果需要向start_rtn傳遞多於一個的參數時,可將多個參數放在一個結構中,然後將結構的地址作爲arg參數傳入
線程創建時不能保證那個線程會先運行,新創建的線程可以訪問進程的地址空間,並且繼承調用線程的浮點環境和信號屏蔽字,但是該線程的掛起信號集會被清除。
線程終止
單個線程可以通過3種方式退出:
- 線程可以簡單地從啓動例程中返回,返回值是線程的退出碼。
- 線程可以被同一個進程中的其他線程取消
- 線程調用pthread_exit函數
線程退出時,線程本身可以調用pthread_exit(void* rval_pt)函數設置退出碼
進程中的其他線程調用pthread_join(pthread_t tid, void** rval_ptr)獲取線程的返回碼;如果線程是被取消的,由人rval_ptr指定的內存單元就設置爲PTHREAD_CANCEL