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 100struct 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);elseworker_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;
}
欢迎留言交流。。。