运行环境: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