pi2.c: 使用N个线程根据莱布尼兹级数计算PI
• 与上一题类似,但本题更加通用化,能适应N个核心,需要使用线程参数来实现
• 主线程创建N个辅助线程
• 每个辅助线程计算一部分任务,并将结果返回
• 主线程等待N个辅助线程运行结束,将所有辅助线程的结果累加
实现思路:
N
为创建线程的个数,在main()
函数控制创建的线程的个数,并在创建线程时,根据创建的顺序向void *worker(void *arg)
函数传递相应的参数,控制线程计算起始值。通过return result
;将计算结果返回,在主函数中通过pthread_join()
接受result
,累加起来,乘四,得计算结果。
实现代码:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<pthread.h>
#define NUMBER 200
#define N 100
struct param{
int start;
int end;
};
struct result{
double worker_output;
};
void *worker(void *arg){
int i;
double j;
struct param *param;
struct result *result;
double worker_output=0;
param=(struct param*)arg;
for(i=param->start;i<=param->end;i++){
j=i;
if(i%2==0)
worker_output-=1/(2*j-1);
else
worker_output+=1/(2*j-1);
}
result=malloc(sizeof(struct result));
result->worker_output=worker_output;
return result;
}
int main(){
int i;
pthread_t worker_tids[N];
struct param params[N];
double sum=0;
for(i=0;i<N;i++){
struct param *param;
param=¶ms[i];
param->start=i*NUMBER +1;
param->end=(i+1)*NUMBER;
pthread_create(&worker_tids[i],NULL,worker,param);
}
for(i=0;i<N;i++){
struct result *result;
pthread_join(worker_tids[i],(void **)&result);
sum+=result->worker_output;
free(result);
}
printf("PI: %f\n",sum*4);
return 0;
}
欢迎留言交流。。。