1. 線程標識:
(1) 比較兩個線程ID;
#include <pthread.h> int pthread_equal(pthread_t tid1, pthread_t tid2); ret-若相等則返回非0值,否則返回0值
(2) 獲取線程自身ID;
#include <pthread.h> pthread_t pthread_self(void); ret-調用線程的線程ID
2. 線程的創建:
#include <pthread.h> int pthread_create(pthread_t *restrict tidp, //返回線程的ID
const pthread_attr_t *restrict attr, //線程屬性,默認為NULL
void *(*start_rtn)(void), //線程函數入口地址
void *restrict arg); //參數 ret-成功返回0 失敗返回錯誤編號
3. 線程的終止:
(1) 線程只是從啟動例程中返回,返回值是線程的退出碼;
(2) 線程可以被同一例程中的其他線程取消;
(3) 線程調用pthread_exit。
#include <pthread.h> void pthread_exit(void *rval_ptr);
rval_ptr是一個無類型指針,與傳遞給啟動例程的單個參數類似,進程中的其他線程可以通過調用pthread_join函數訪問到這個指針;
#include <pthread.h> int pthread_join(pthread_t thread, void **rval_ptr);
ret-成功返回0 否則返回錯誤編號
調用線程一直阻塞,知道指定的線程調用pthread_exit,從啟動例程中返回或者被取消;如果線程只是從他的啟動例程中返回,rval—_ptr將包含返回碼;如果線程被取消,由rval_ptr指定的內存單元就設置為PTHREAD_CANCELED.
如果線程已經處於分離狀態,pthread_t就會調用失敗,返回EINVAL。
如果對線程的返回值不感興趣,可以吧rval_prt設置為NULL。這種情況下,調用pthread_join將等待線程終止,但不獲取線程的終止狀態。
4. 線程取消:
#include <pthread.h> int pthread_cancel(pthread_t tid); ret-成功返回0 失敗返回錯誤碼
函數使得由tid標識的線程行為表現為如果調用了參數是PTHREAD_CANCELD的pthread_exit函數,但是,線程可以選擇忽略取消方式或者是控制取消方式。函數並不等待線程終止,它僅僅是提出請求;
5. 線程清理處理函數:
#include <pthread.h> void pthread_cleanup_push(void(*rtn)(void*), void *arg); void pthread_cleanup_pop(int execute); //調用刪除上次push的清理程序
當線程執行以下動作時調用清理函數,調用者參數為arg,清理函數rtn的調用順序是由pthread_cleanup_pus來安排的。
a. 調用pthread_exit;
b. 想用取消請求;
c. 用非零的execute參數調用pthread_cleanup_pop;
如果execute=0則函數不被調用;
注意正常從線程返回的時候,不會調用該清理函數;