說起屏障這個東西,相信對於大多數朋友來說比較陌生,不過要是說起pthread_join這個函數,相信都比較熟悉。我們通常使用這個函數來等待其它線程結束,例如主線程創建一些線程,這些線程去完成一些工作,而主線程需要去等待這些線程結束。其實pthread_join就實現了一種屏障。我們可以對屏障這樣理解,把屏障理解為為了協同線程之間的工作而使得某一具體線程進入等待狀態的一種機制。下面我們來看看UNIX為我們提供的一個屏障——barrier。
注:與所有的線程函數一樣,使用屏障barrier時需要包含頭文件pthread.h,編譯時需要添加參數 -lpthread
屏障barrier的相關結構:pthread_barrier_t
初始化屏障結構函數:int pthread_barrier_init(pthread_barrier_t *restrict barrier, const pthread_barrierattr_t *restrict attr, unsigned int count);
函數執行成功返回 0,執行失敗則返回一個錯誤號,我們可以通過該錯誤號獲取相關的錯誤信息
函數第一個參數:一個指向pthread_barrier_t 類型的指針,我們必須要指出的是pthread_barrier_init函數不會給指針分配相關內存空間,因此我們傳入的指針必須為一個pthread_barrier_t 變量
函數第二個參數:用於指定屏障的細節參數,我們這里可以暫且不去管它,如果我們傳入NULL,那么系統將按照默認情況處理
函數第三個參數:設計屏障等待的最大線程數目
銷毀屏障函數:int pthread_barrier_destory(pthread_barrier_t *barrier);
函數執行成功返回 0,執行失敗則返回一個錯誤號,我們可以通過該錯誤號獲取相關的錯誤信息
函數參數:指向pthread_barrier_t 變量的指針
我們需要注意的是,當一個屏障被使用完(即屏障已經等待了足夠數目的線程后)就應該被銷毀,故一個屏障我們不能復用,除非我們將它銷毀並重新初始化
屏障等待函數:int pthread_barrier_destory(pthread_barrier_t *barrier);
函數執行成功返回 0,執行失敗則返回一個錯誤號,我們可以通過該錯誤號獲取相關的錯誤信息
函數參數:指向pthread_barrier_t 變量的指針
一個線程需要等待其它多個線程結束時,調用該函數
在這里我們需要注意的是使用barrier這個屏障我們無法獲取線程的結束狀態,若想要獲取相關線程結束狀態我們仍然需要調用pthread_join函數。當然我們一般也不會把pthread_barrier_wait 放在某個線程結束時候,這顯然是很無聊的,這個函數調用往往出現在線程之間的某個位置,接下來線程等待其它協同線程到達屏障后再處理一些其它事務。