日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux多线程实践(7) --多线程排序对比

發(fā)布時間:2025/3/17 linux 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux多线程实践(7) --多线程排序对比 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

屏障

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);

? 屏障允許任意數(shù)量的線程等待,?直到所有的線程完成處理工作,?而線程不需要退出,?所有線程達(dá)到屏障之后可以接著工作.

??init:在初始化屏障時,?可以使用第三個參數(shù)count指定,?在允許所有線程繼續(xù)運行之前,?必須到達(dá)屏障的線程數(shù)目.

??wait:可以使用pthread_barrier_wait函數(shù)來表明,?線程已經(jīng)完成工作,?準(zhǔn)備等所有其他線程趕上來;

????調(diào)用wait的線程在屏障計數(shù)未滿足條件時,?會進(jìn)入休眠狀態(tài).?如果該線程是最后一個調(diào)用wait的線程,?就滿足了屏障計數(shù),?所有的線程都被喚醒.

??對于一個任意線程,?pthread_barrier_wait函數(shù)返回了PTHREAD_BARRIER_SERIAL_THREAD.?剩下的線程看到的返回值是0.?這使得一個線程可以作為主線程,?他可以工作在其他所有線程已完成的工作結(jié)果上.

?

單線程與多線程排序

單線程排序

bool compare(long a, long b) {return a < b; }#define NUMNUM 8000000L long int nums[NUMNUM]; //待排序數(shù)組(約32M)int main() {srandom(time(NULL));for (unsigned long i = 0; i < NUMNUM; i++)nums[i] = random();struct timeval start, end;//計時開始gettimeofday(&start,NULL);sort(nums,nums+NUMNUM,compare); //單線程排序,快速排序gettimeofday(&end,NULL);//計算用時long long startusec = start.tv_sec * 1000000 + start.tv_usec;long long endusec = end.tv_sec * 1000000 + end.tv_usec;double elapsed = (double)(endusec - startusec) / 1000000.0;printf("sort took %.4f seconds\n", elapsed);//將排序后的結(jié)果寫入文件, 以便查看是否已經(jīng)排好序FILE *fp = fopen("save.txt", "w+");for (unsigned long i = 0; i < NUMNUM; i++)fprintf(fp, "%ld ", nums[i]); }

三次排序用時如下:

??sort?took?3.2435?seconds

??sort?took?3.2221?seconds

??sort?took?3.2134?seconds

(附-主機(jī)配置:?雙核四線程(Intel(R)?Core(TM)?i3-2350M?CPU?@?2.30GHz))

?

多線程排序(使用屏障同步)

#define NTHR 8 /* 線程數(shù) */ #define NUMNUM 8000000L /* 待排序數(shù) */ #define TNUM (NUMNUM/NTHR) /* 每個線程分配到的需要排序的數(shù) */ long nums[NUMNUM]; long snums[NUMNUM]; pthread_barrier_t b; //屏障bool compare(long a, long b) {return a < b; } //排序線程 //對nums數(shù)組的從idx~idx+TNUM部分進(jìn)行快速排序 void *workThread(void *arg) {long idx = (long)arg;sort(&nums[idx],&nums[idx+TNUM],compare);pthread_barrier_wait(&b);pthread_exit(NULL); }//對已經(jīng)排好序數(shù)組nums的NTHR部分進(jìn)行合并 void merge() {long idx[NTHR]; //idx保存數(shù)組nums的NTHR部分的起始位置for (long i = 0; i < NTHR; i++)idx[i] = i * TNUM;for (long sidx = 0; sidx < NUMNUM; sidx++){long minidx;long num = LONG_MAX;//從NTHR部分的數(shù)組中查找出最小的一個, 將其index保存到idx[minidx]中for (long i = 0; i < NTHR; i++){//idx[i] < (i+1)*TNUM 確保是在一個部分之中,//不會產(chǎn)生兩個部分相互比較的情況if ((idx[i] < (i+1)*TNUM) && (nums[idx[i]] < num)){num = nums[idx[i]];minidx = i;}}snums[sidx] = nums[idx[minidx]];idx[minidx]++;} }int main() {srandom(time(NULL));for (unsigned long i = 0; i < NUMNUM; i++)nums[i] = random();//創(chuàng)建NTHR個線程分別對數(shù)組相鄰的NTHR部分進(jìn)行排序struct timeval start, end;pthread_t tid;gettimeofday(&start, NULL);pthread_barrier_init(&b, NULL, NTHR+1);for (unsigned long i = 0; i < NTHR; i++)pthread_create(&tid, NULL,workThread, (void *)(i * TNUM));pthread_barrier_wait(&b);merge();gettimeofday(&end, NULL);//計算用時long long startusec = start.tv_sec * 1000000 + start.tv_usec;long long endusec = end.tv_sec * 1000000 + end.tv_usec;double elapsed = (double)(endusec - startusec) / 1000000.0;printf("sort took %.4f seconds\n", elapsed);//將排序后的結(jié)果寫入文件, 以便查看是否已經(jīng)排好序FILE *fp = fopen("save.txt", "w+");for (unsigned long i = 0; i < NUMNUM; i++)fprintf(fp, "%ld ", snums[i]); }

八線程排序:

??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

(附-主機(jī)配置:?雙核四線程(Intel(R)?Core(TM)?i3-2350M?CPU?@?2.30GHz))

?

總結(jié):?可以看到盡管在分別進(jìn)行排序之后還要有合并(merge)這一步,多線程排序(計算密集型任務(wù))還是要優(yōu)于單線程排序(在CPU為多核的情況下),而且在CPU為四線程下,使用四個線程對數(shù)組進(jìn)行排序,所耗費時間是最少的!

總結(jié)

以上是生活随笔為你收集整理的Linux多线程实践(7) --多线程排序对比的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久久午夜福利电影 | 999免费| 影音先锋中文字幕在线 | 亚洲人av在线| 国产av电影一区二区 | 亚洲精品中文字幕乱码三区 | 黄色大片免费的 | 男人av网站| 日本激情视频在线 | 黄色中文字幕在线观看 | 天天看a | 麻豆一区产品精品蜜桃的特点 | 91视频青青草| 亚洲av无码国产在丝袜线观看 | 成人手机在线观看 | 涩涩在线播放 | 欧美日韩国产亚洲沙发 | 成人欧美一区二区三区白人 | 桥本有菜aⅴ一区二区三区 在线午夜电影 | 久久精品网址 | 亚洲资源在线观看 | 国产又粗又猛又黄视频 | 亚洲乱码一区二区 | 大陆农村乡下av | 香蕉伊人 | 91国自啪| 夜夜操天天 | 丁香婷婷一区二区三区 | 综合视频一区二区 | 日本视频免费在线播放 | 国产精品高潮呻吟久久av野狼 | 一级真人毛片 | 放荡的美妇在线播放 | 国产香蕉视频在线播放 | 国产wwww | 综合色久 | 久久精品国产99国产 | 少妇高潮惨叫久久久久久 | 插我舔内射18免费视频 | 成年人一级片 | 五月导航| 五月天av网 | 亚洲va久久久噜噜噜久久天堂 | 日韩经典一区二区 | 国产传媒一区二区三区 | 一级a性色生活片久久毛片 爱爱高潮视频 | 亚洲一区二区精华 | 无码少妇一区二区三区芒果 | 狠狠干影院 | 青青草免费在线观看视频 | 天天添 | 亚洲美女一区 | 成人av手机在线观看 | 国产女同在线观看 | 国产99久久久久久免费看 | 国产在线视频自拍 | www.日本黄色| 精品久久九九 | 亚洲精品少妇久久久久久 | 蜜桃久久一区二区三区 | 国产伦理自拍 | 国产精品成人aaaa在线 | 性涩av | 久久久一区二区三区四区 | 91九色在线观看 | 日韩毛片 | 日本在线观看a | 精品不卡一区 | 中文字幕一区二区三区精品 | 一区二区影视 | 高h喷水荡肉少妇爽多p视频 | 精品久久9999 | 久草91 | 俄罗斯毛片基地 | 91久久综合精品国产丝袜蜜芽 | 欧美成人一区二区三区片免费 | 免费无遮挡无码永久在线观看视频 | 一级特黄免费视频 | 欧洲亚洲另类 | 国产精品久久久久野外 | 精品久久久久久久久久久久久久 | 蜜臀一区二区三区 | 狠狠干精品| 日韩av在线一区 | 成人av小说 | 欧美日韩精品网站 | 国产15页 | 精品一区二区视频 | 欧美成人精品一区二区男人小说 | 亚洲色图av在线 | 日本在线免费观看视频 | 黄av在线播放 | 波多野42部无码喷潮 | 五月天激情丁香 | 一本久久道 | 欧美性xxxx在线播放 | 亚洲成人免费看 | 久久精品视频5 | 亚洲xx视频|