Linux多執行緒實踐 7 多執行緒排序對比

2021-09-21 16:45:40 字數 2148 閱讀 5628

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版...