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;
}
歡迎留言交流。。。