归并算法--多线程运行程序

运行环境:Linux环境下

c代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <pthread.h>
#include <sys/time.h>
int MAX_THREADS = 16; /* change this to control thread counts */
long SORT_NUM = 100000000;        /* max sort array length */
long *a;                        /* to be sorted array */
long *b;                        /* sorted array */
int threads_count = 0;
void gen_list(void) {//产生随机数
    srand((unsigned)time(NULL));//伪随机数序列生成:初始化rand()接受无符号整型参数作为伪随机数种子.如果种子相同,伪随机数列也相同。
    // srand((unsigned) time(NULL)); 直接传入一个空指针,因为你的程序中往往并不需要经过参数获得的t数据
a = (long *)malloc(sizeof(long)*SORT_NUM);
    for (long i = 0; i < SORT_NUM; ++i)
    {
        a[i] = rand()%500000 + 1;
    }
}
void print_array()//打印数组
{
    long i = 0;
    for (i = 0; i < 10; i++) {
        printf("%ld\n", a[i]);
    }
}
struct index {int p, r;};
void merge_sort_one(void *param) { /* one thread merge sort */
    struct index *pr = (struct index*)param;
    long p = pr->p;
    long r = pr->r;
    if (p == r) {
        return;
    }
    struct index pr1, pr2;
    long q = (p+r) / 2;
    pr1.p = p; pr1.r = q;
    pr2.p = q + 1; pr2.r = r;
    merge_sort_one(&pr1);
    merge_sort_one(&pr2);
    long k = p, i = p, j = q+1;//p为该数组的起点,q是中点,r是终点
    while (i <= q && j <= r) {//归并两个数组,结果放在b中
        if (a[i] < a[j])
            b[k++] = a[i++];
        else
            b[k++] = a[j++];
    }
    for (; i <= q; i++) {//当while中j > r时
        b[k++] = a[i];
    }
    for (; j <= r; j++) {//当while中i > q时
        b[k++] = a[j];
    }
    for (i = p; i < r; i++) {//将b数组中的数据全部赋值给a
        a[i] = b[i];
    }
}
void merge_sort(void *param) {  /* multi thread sort */
    struct index *pr = (struct index*)param;
    long p = pr->p;
    long r = pr->r;
    long ret1, ret2;
    if (p == r)
        pthread_exit(0);//pthread_exit():终止当前线程
    pthread_t thread1, thread2;//数据类型:线程句柄
    struct index pr1, pr2;
    long q = (p+r) / 2;
    pr1.p = p; pr1.r = q;
    pr2.p = q + 1; pr2.r = r;
    if (threads_count <= MAX_THREADS/2) { /* maybe fixed thread numbers */
        ret1 = pthread_create(&thread1, NULL, merge_sort, (void *) &pr1);//pthread_create():创建一个用户级线程
if (ret1 > 0)
            printf("Thread1 create failed\n");
        else {
            threads_count++;
            printf("The %dth thread created\n", threads_count);
        }
        ret2 = pthread_create(&thread2, NULL, merge_sort, (void *) &pr2);
        if (ret2 > 0)
            printf("Thread2 create failed\n");
        else {
            threads_count++;
            printf("The %dth thread created\n", threads_count);
        }
        pthread_join(thread1, NULL);//阻塞当前的线程,直到另外一个线程运行结束
        pthread_join(thread2, NULL);
    } else {
        merge_sort_one(&pr1);
        merge_sort_one(&pr2);
    }
    long k = p, i = p, j = q+1;
    while (i <= q && j <= r) {
        if (a[i] < a[j])
            b[k++] = a[i++];
        else
            b[k++] = a[j++];
    }
    for (; i <= q; i++) {
        b[k++] = a[i];
    }
    for (; j <= r; j++) {
        b[k++] = a[j];
    }
    for (i = p; i < r; i++) {
        a[i] = b[i];
    }
    pthread_exit(0);
}
int main(void)
{
    //double tstart, tend, tcost;
    b = (long*)malloc(sizeof(long)*SORT_NUM);
        gen_list();
        struct index start;
        start.p = 0;
        start.r = SORT_NUM - 1;
        pthread_t start_thread;
        struct timeval  time_start, time_end;
        gettimeofday(&time_start,NULL);
        //printf("t1: %lld\n", t1);
        //tstart = clock();
      pthread_create(&start_thread, NULL, merge_sort, &start);
        pthread_join(start_thread, NULL);
        gettimeofday(&time_end,NULL);
        printf("Under max thread: %d\n", MAX_THREADS);
        printf("Costed time in ms: %ld ms\n",
               (((time_end.tv_sec - time_start.tv_sec)*1000000L
                 +time_end.tv_usec) - time_start.tv_usec)/1000
            ); // Added semicolon
        free(a);
        free(b);
       return 0;
}

运行结果:

单线程在我机器上  36745ms
4线程  16543ms
16线程 16551ms
256线程 17217ms



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值