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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

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

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

屏障

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)

{

return a < b;

}

#define NUMNUM 8000000L

long int nums[NUMNUM]; //待排序數組(約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);

//將排序后的結果寫入文件, 以便查看是否已經排好序

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

(附-主機配置:?雙核四線程(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)

{

return a < b;

}

//排序線程

//對nums數組的從idx~idx+TNUM部分進行快速排序

void *workThread(void *arg)

{

long idx = (long)arg;

sort(&nums[idx],&nums[idx+TNUM],compare);

pthread_barrier_wait(&b);

pthread_exit(NULL);

}

//對已經排好序數組nums的NTHR部分進行合并

void merge()

{

long idx[NTHR]; //idx保存數組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部分的數組中查找出最小的一個, 將其index保存到idx[minidx]中

for (long i = 0; i < NTHR; i++)

{

//idx[i] < (i+1)*TNUM 確保是在一個部分之中,

//不會產生兩個部分相互比較的情況

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

//創建NTHR個線程分別對數組相鄰的NTHR部分進行排序

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

//將排序后的結果寫入文件, 以便查看是否已經排好序

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

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

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

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产ts变态重口人妖hd | 中文字幕人妻丝袜乱一区三区 | 2022天天操 | 国产精品欧美性爱 | 午夜视频在线观看一区二区 | 99精品久久 | 国产成人免费观看 | 中文字幕第二区 | 国产亲伦免费视频播放 | 日本少妇毛茸茸高潮 | 黄色的网站在线观看 | 免费av网址在线观看 | 少妇aaaa| 熟妇人妻va精品中文字幕 | 国产视频综合 | 中国精品久久 | 人与拘一级a毛片 | 精品福利电影 | 国产精品69久久久久 | 日韩人妻无码精品久久免费 | 亚洲国产欧美一区二区三区深喉 | 91欧美激情一区二区三区 | 久久网免费视频 | 中文字幕高清一区 | 国产极品一区 | 欧美久久伊人 | 男女午夜影院 | av在线黄| 天堂在线精品视频 | 国产精品视频一二三 | 免费无码av片在线观看 | 美女免费av | 精品欧美 | 亚洲日皮 | 日本欧美一区二区三区 | 在线观看av国产一区二区 | 亚州视频在线 | 清清草在线视频 | 在线看黄色av | 亚洲在线激情 | 一级黄色片毛片 | 中文字幕第八页 | 国产综合精品一区二区三区 | av黄色网址 | 日日夜夜添 | 久久久久黄色片 | 亚洲天堂av在线播放 | 99视频精品 | 亚洲午夜一区二区 | 手机av在线不卡 | 久久婷婷色 | 农村妇女愉情三级 | 黄毛片在线观看 | 女王脚交玉足榨精调教 | 91蝌蚪视频在线观看 | 丰满岳乱妇国产精品一区 | 国产又黄又粗又猛又爽视频 | 国产亚洲精品女人久久久久久 | 国产精品亚洲色图 | 高h乱l高辣h文短篇h | 土耳其xxxx性hd极品 | 69xx国产| 久久丫精品久久丫 | 超碰男人的天堂 | 男人的天堂免费视频 | 一区二区三区视频免费视 | 中文字幕一区二区三区免费视频 | 69xx欧美| 性视频在线播放 | 国产精品亚洲视频 | 日日舔夜夜摸 | 久久99国产精品一区 | 午夜时刻免费入口 | 亚洲丁香色 | 成人va视频 | 精品国产亚洲一区二区麻豆 | 久久综合久久综合久久综合 | 日韩无码精品一区二区三区 | 日本国产一级片 | 91亚洲在线 | 国产在线精品一区 | 国产美女无遮挡永久免费观看 | 成人av在线看 | 五月婷婷综合在线观看 | 色原网| 乱人伦中文字幕 | 日穴视频| 操你啦在线视频 | 亚洲一区二区网站 | 亚洲 欧美 日韩 综合 | 极品美女开粉嫩精品 | 国产欧美精品一区二区三区 | 天天躁夜夜躁 | 欧美爽爽 | 日本a级大片 | 黄av在线播放 | 欧美大色网 | 在线免费观看av不卡 | 国产成人精品无码免费看在线 |