c的多線程實例

 

線程特色

線程擁有本身獨立的棧、調度優先級和策略、信號屏蔽字(建立時繼承)、errno變量以及線程私有數據。進程的其餘地址空間均被全部線程所共享,所以線程能夠訪問程序的全局變量和堆中分配的數據,並經過同步機制保證對數據訪問的一致性。

線程建立

int pthread_create(pthread_t * thread, const pthread_attr_t *attr,void *(*start_routine)(void*), void *arg);

返回值:如果成功創建線程返回0,不然返回錯誤的編號。html

形式參數:pthread_t* thread  要建立的線程的線程id指針;
     const pthread_attr_t *restrict attr 建立線程時的線程屬性;
       void *(start_rtn)(void)    返回值是void類型的指針函數;
     void *restrict arg           start_rtn的形參。
 

線程掛起

該函數的做用使得當前線程掛起,等待另外一個線程返回才繼續執行。也就是說當程序運行到這個地方時,程序會先中止,而後等線程id爲thread的這個線程返回,而後程序纔會斷續執行。
int pthread_join(pthread_t thread, void **value_ptr);
參數說明以下:thread等待退出線程的線程號;value_ptr退出線程的返回值。
返回值:若成功,則返回0;若失敗,則返回錯誤號。
 

取消線程

    取消操做容許線程請求終止其所在進程中的任何其餘線程。不但願或不須要對一組相關的線程執行進一步操做時,能夠選擇執行取消操做。例如,用戶請求關閉或退出正在運行的應用程序。另外一個示例是完成由許多線程執行的任務。其中的某個線程可能最終完成了該任務,而其它線程還在繼續運行。因爲正在運行的線程此時沒有任何用處,所以取消這個線程。編程

取消點

      僅當取消操做安全時才應取消線程。pthreads標準指定了幾個取消點,其中包括:安全

  •  經過pthread_testcancel調用以編程方式創建線程取消點。
  •  線程等待pthread_cond_wait或pthread_cond_timewait()中的特定條件。
  •  被sigwait(2)阻塞的函數
  •  一些標準的庫調用。一般,這些調用包括線程可基於阻塞的函數。

真正的 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);

獲取當前線程id

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;            //靜態建立

 

建立pthread_mutex_init;銷燬pthread_mutex_destroy;加鎖pthread_mutex_lock;解鎖pthread_mutex_unlock。
條件鎖
建立pthread_cond_init;銷燬pthread_cond_destroy;觸發pthread_cond_signal;廣播pthread_cond_broadcast;等待pthread_cond_wait。
相關文章
相關標籤/搜索