📄 pai1.c
字号:
#include<stdio.h>#include<stdlib.h>#include<pthread.h>#include<math.h>#include<time.h>int N=10000000;int M=0;double pai=0;double THREAD_NUMBER=2;static pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;// quick lockvoid* calculatePai(void *arg){ int i; int thread_id=*(int*)arg; double tmp; for(i=thread_id;i<N;i+=THREAD_NUMBER){ tmp=4.0/(1+((i+0.5)/N*(i+0.5)/N)); pthread_mutex_lock(&mutex); pai+=tmp; pthread_mutex_unlock(&mutex); }}void* MonteKarlo(void *arg ){ int i; int thread_id=*(int*)arg; for(i=thread_id;i<N;i+=THREAD_NUMBER) { double x=(double)((rand()%11)); double y=(double)((rand()%11)); double dis=x*x+y*y; if(dis<=100){ pthread_mutex_lock(&mutex); M++; pthread_mutex_unlock(&mutex); } }}int main(int argc,char* argv[]){ int m,n; if(argc<3){ printf("Number of arguments must be greate than 2!\n"); exit(1); } m=atoi(argv[1]); n=atoi(argv[2]); if(m<0||n<0){ printf("arguments must be >0!\n"); exit(1); } THREAD_NUMBER=m; N=n; //printf("argc=%d m=%d n=%d\n",argc,m,n); pthread_t pt[50]; int i; int arg[50]; time_t begin_time,end_time; clock_t start,finish; begin_time=time(NULL); start=clock(); for(i=0;i<THREAD_NUMBER;i++){ arg[i]=i; /* if(pthread_create(&pt[i],NULL,MonteKarlo,(void*)&arg[i])){ printf("pthread_create error\n"); exit(1); }*/ if(pthread_create(&pt[i],NULL,calculatePai,(void*)&arg[i])){ printf("pthread_create error\n"); exit(1); } } for(i=0;i<THREAD_NUMBER;i++){ if(pthread_join(pt[i],NULL)){ printf("pthread_join error\n"); exit(1); } } pai/=N; //printf("pai=%lf\n",pai); finish=clock(); end_time=time(NULL); //printf("Pai=%.5lf, time consumed:%lf\n",1.0*M/N*4,difftime(end_time,begin_time)); //printf("Pai=%.5lf, time consumed:%lf\n",pai,difftime(end_time,begin_time)); printf("Pai=%.5lf, time consumed:%lf\n",pai,(double)(finish-start)/CLOCKS_PER_SEC); pthread_mutex_destroy(&mutex);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -