int pthread_barrier_init(pthread_barrier_t *restrict barrier,
const pthread_barrierattr_t *restrict attr,
unsigned count);
int pthread_barrier_destroy(pthread_barrier_t *barrier);
int pthread_barrier_wait(pthread_barrier_t *barrier);
屏障允許任意數量的執行緒等待, 直到所有的執行緒完成處理工作, 而執行緒不需要退出, 所有執行緒達到屏障之後可以接著工作.
init:在初始化屏障時, 可以使用第三個引數count指定, 在允許所有執行緒繼續執行之前, 必須到達屏障的執行緒數目.
wait:可以使用pthread_barrier_wait函式來表明, 執行緒已經完成工作, 準備等所有其他執行緒趕上來;
呼叫wait的執行緒在屏障計數未滿足條件時, 會進入休眠狀態. 如果該執行緒是最後乙個呼叫wait的執行緒, 就滿足了屏障計數, 所有的執行緒都被喚醒.
對於乙個任意執行緒, pthread_barrier_wait函式返回了pthread_barrier_serial_thread. 剩下的執行緒看到的返回值是0. 這使得乙個執行緒可以作為主線程, 他可以工作在其他所有執行緒已完成的工作結果上.
單執行緒排序
bool compare(long a, long b)
#define numnum 8000000l
long int nums[numnum]; //待排序陣列(約32m)
int main()
三次排序用時如下:
sort took 3.2435 seconds
sort took 3.2221 seconds
sort took 3.2134 seconds
(附-主機配置: 雙核四執行緒(intel(r) core(tm) i3-2350m cpu @ 2.30ghz))
多執行緒排序(使用屏障同步)
#define nthr 8 /* 執行緒數 */
#define numnum 8000000l /* 待排序數 */
#define tnum (numnum/nthr) /* 每個執行緒分配到的需要排序的數 */
long nums[numnum];
long snums[numnum];
pthread_barrier_t b; //屏障
bool compare(long a, long b)
//排序執行緒
//對nums陣列的從idx~idx+tnum部分進行快速排序
void *workthread(void *arg)
//對已經排好序陣列nums的nthr部分進行合併
void merge()
}snums[sidx] = nums[idx[minidx]];
idx[minidx]++;
}}int main()
八執行緒排序:
sort took 1.5556 seconds
sort took 1.5676 seconds
sort took 1.5719 seconds
四執行緒排序:
sort took 1.4132 seconds
sort took 1.4315 seconds
sort took 1.4738 seconds
二線程排序:
sort took 2.0581 seconds
sort took 2.2358 seconds
sort took 1.7775 seconds
(附-主機配置: 雙核四執行緒(intel(r) core(tm) i3-2350m cpu @ 2.30ghz))
總結: 可以看到儘管在分別進行排序之後還要有合併(merge)這一步,多執行緒排序(計算密集型任務)還是要優於單執行緒排序(在cpu為多核的情況下),而且在cpu為四執行緒下,使用四個執行緒對陣列進行排序,所耗費時間是最少的!
Linux多執行緒實踐 7 多執行緒排序對比
int pthread barrier init pthread barrier t restrict barrier,const pthread barrierattr t restrict attr,unsigned count int pthread barrier destroy pthre...
Linux多執行緒程式設計(實踐)
下面先來乙個例項。我們通過建立兩個執行緒來實現對乙個數的遞加。或許這個例項沒有實際運用的價值,但是稍微改動一下,我們就可以用到其他地方去拉。下面我們先來編譯 執行一下 gcc lpthread o thread example thread example.c thread example 我是主函...
Linux多執行緒實踐 2 執行緒基本API
與執行緒有關的函式構成了乙個完整的系列,絕大多數函式的名字都是以 pthread 開頭,要使用這些函式庫,要通過引入頭文,而且鏈結這些執行緒函式庫時要使用編譯器命令的 lpthread 選項 ubuntu系列系統需要新增的是 pthread 選項而不是 lpthread 如ubuntu 14.04版...