int pthread_create(pthread_t * thread, const pthread_attr_t *attr,void *(*start_routine)(void*), void *arg);
返回值:如果成功創建線程返回0,不然返回錯誤的編號。html
int pthread_join(pthread_t thread, void **value_ptr);
取消操做容許線程請求終止其所在進程中的任何其餘線程。不但願或不須要對一組相關的線程執行進一步操做時,能夠選擇執行取消操做。例如,用戶請求關閉或退出正在運行的應用程序。另外一個示例是完成由許多線程執行的任務。其中的某個線程可能最終完成了該任務,而其它線程還在繼續運行。因爲正在運行的線程此時沒有任何用處,所以取消這個線程。編程
僅當取消操做安全時才應取消線程。pthreads標準指定了幾個取消點,其中包括:安全
真正的 Cancellation Points 只是在這些函數中 Cancellation Type 被修改成 PHREAD_CANCEL_ASYNCHRONOUS 和修改回 PTHREAD_CANCEL_DEFERRED 中間的一段時間。 這句話很是重要。多線程
發送終止信號給thread線程,若是成功則返回0,不然爲非0值。發送成功並不意味着thread會終止。異步
int pthread_cancel(pthread_t thread);
int pthread_setcancelstate(int state, int *oldstate);
兩種主要狀態:函數
PTHREAD_CANCEL_ENABLE(默認),收到cancel信號立刻設置退出狀態。測試
PTHREAD_CANCEL_DISABLE 收到cancel信號繼續運行。spa
int pthread_setcanceltype(int type, int *oldtype);
類型有兩種,只有在PTHREAD_CANCEL_ENABLE狀態下有效:線程
PTHREAD_CANCEL_ASYNCHRONOUS 當即執行取消信號指針
PTHREAD_CANCEL_DEFERRED 運行到下一個取消點
void pthread_testcancel(void); //放置取消點
當stage=ENABLE && type = DEFERRED 時,pthread_testcancel()函數有效。若是在取消功能到處於禁用狀態下調用pthread_testcancel(),則該函數不起做用。
請務必僅在線程取消線程操做安全的序列中插入pthread_testcancel()。除經過pthread_testcancel()調用以編程方式創建的取消點意外,pthread標準還指定了幾個取消點。
測試退出點,就是測試cancel信號
不管是可預見的線程終止仍是異常終止,都會存在資源釋放的問題,在不考慮因運行出錯而退出的前提下,如何保證線程終止時能順利的釋放掉本身所佔用的資源,特別是鎖資源,就是一個必須考慮解決的問題。
最常常出現的情形是資源獨佔鎖的使用:線程爲了訪問臨界資源而爲其加上鎖,但在訪問過程當中被外界取消,若是線程處於響應取消狀態,且採用異步方式響應,或者在打開獨佔鎖之前的運行路徑上存在取消點,則該臨界資源將永遠處於鎖定狀態得不到釋放。外界取消操做是不可預見的,所以的確須要一個機制來簡化用於資源釋放的編程。
在POSIX線程API中提供了一個pthread_cleanup_push()/pthread_cleanup_pop()函數對用於自動釋放資源--從pthread_cleanup_push()的調用點到pthread_cleanup_pop()之間的程序段中的終止動做(包括調用pthread_exit()和取消點終止)都將執行pthread_cleanup_push()所指定的清理函數。
成對出現的一對函數,push()將清理函數送入取消清理棧(cancellation cleanup stack), pop()取出棧頂的處理程序,根據參數是否執行
void pthread_cleanup_push(void (*routine)(void*), void *arg);
void pthread_cleanup_pop(int execute);
void pthread_exit(void *value_ptr);
pthread_t pthread_self(void);
條件變量是利用線程間共享的全局變量進行同步的一種機制
int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex); int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime);
int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr); //動態建立 int pthread_cond_destroy(pthread_cond_t *cond); pthread_cond_t cond = PTHREAD_COND_INITIALIZER; //靜態建立