/* pthread version */ #include #include #include static int num_steps=1000000000; double pi, step; struct start_arg { int i_start; int i_end; double sum; } start_arg[2]; void *start_func(void *arg) { int i; double x, sum = 0.0; struct start_arg *p_arg = (struct start_arg *) arg; for (i=p_arg->i_start; ii_end; i++) { x = (i+0.5) * step; sum += 4.0/(1.0 + x*x); } p_arg->sum = sum; return NULL; } int main() { int i; double sum; pthread_t pt_id[2]; step = 1.0/(double) num_steps; start_arg[0].i_start = 0; start_arg[0].i_end = num_steps>>1; start_arg[1].i_start = start_arg[0].i_end + 1; start_arg[1].i_end = num_steps; printf("%d~%d, %d~%d\n", start_arg[0].i_start, start_arg[0].i_end , start_arg[1].i_start, start_arg[1].i_end ); for (i=2; i--; ) { /* create pthread */ if (pthread_create(&pt_id[i], NULL, start_func, &start_arg[i])){ perror("pthread_create"); return 1; } } for (i=2; i--; ) { /* join pthread : explicit barrier */ if (pthread_join(pt_id[i], NULL)){ perror("pthread_join"); return 1; } } sum = start_arg[0].sum + start_arg[1].sum; printf("PI = %.8f (sum = %.8f)\n", step*sum, sum); return EXIT_SUCCESS; }