#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/time.h>
#include <pthread.h>
#define MAXLINE 10000001
double *ptd;
int count[10]={0};
int num=0;
int thread_count;
void* Pth_count(void* rank);
pthread_mutex_t mutex_p;
int main(int argc, char* argv[])
{
//double *ptd;
char *ptc;
FILE *fp;
int i = 0;
struct timeval t_read;
double readCost=0,countCost=0;
struct timeval t_start,t_end;
double readS, start, finish;
//int count[10]={0};
//int num=0;
ptd = (double *)malloc(MAXLINE * sizeof(double));
ptc = (char *)malloc(10 * sizeof(char));
long thread;
pthread_t* thread_handles;
thread_count = strtol(argv[1], NULL, 10);
thread_handles = malloc(thread_count * sizeof(pthread_t));
pthread_mutex_init(&mutex_p,NULL);
gettimeofday(&t_read,NULL);
readS = t_read.tv_sec*1000 + t_read.tv_usec/1000.0;
if((fp = fopen("data.txt","r")) == NULL)
{
printf("Can't open \n");
exit(1);
}
i=0;
while(fgets(ptc, 10, fp) != NULL && ptc[0] != '\n' && i < MAXLINE)
{
ptd[i] = atof(ptc);
i++;
}
num = i;
free(ptc);
if(fclose(fp)!=0)
{
fprintf(stderr,"Error closing file\n");
}
gettimeofday(&t_start,NULL);
start = t_start.tv_sec*1000 + t_start.tv_usec/1000.0;
/*
for(i=0; i<num; i++)
{
count[(int)ptd[i]]++;
}
*/
for(thread=0; thread<thread_count;thread++)
{
pthread_create(&thread_handles[thread], NULL, Pth_count, (void*) thread);
}
for(thread=0; thread<thread_count;thread++)
{
pthread_join(thread_handles[thread],NULL);
}
gettimeofday(&t_end,NULL);
finish = t_end.tv_sec*1000 + t_end.tv_usec/1000.0;
readCost = start - readS;
countCost = finish - start;
printf("\nread file spend: %f ms\n\ncount datas spend: %f ms\n\n",readCost,countCost);
free(thread_handles);
for(i=0;i<10;i++)
{
printf("%d<=x<%d: %d条\n",i,i+1,count[i]);
}
free(ptd);
return 0;
}
void* Pth_count(void* rank)
{
long my_rank = (long)rank;
int i;
int local_num = num/thread_count;
//printf("\n%d\n%d\n",num,local_num);
int my_left_edge = my_rank * local_num;
int my_right_edge = (my_rank+1) * local_num -1;
//double* pth_data = ptd;
int local_count[10]={0};
for(i=my_left_edge; i<=my_right_edge; i++)
{
local_count[(int)ptd[i]]++;
}
pthread_mutex_lock(&mutex_p);
for(i=0; i<10; i++)
{
count[i] += local_count[i];
}
pthread_mutex_unlock(&mutex_p);
/*
for(i=0;i<10;i++)
{
printf("%d<=x<%d: %d条\n",i,i+1,count[i]);
}
*/
return NULL;
}
使用pthread实现统计直方图
最新推荐文章于 2023-04-10 20:25:41 发布