/* ===================================================== Thread example: find min in array ===================================================== */ #include #include #include #include #include struct timeval start_time, stop_time; #define MAX 100000000 int num_threads; int start[100]; double x[MAX]; double _min[100]; pthread_t tid[100]; /* -------------------------------------- Find the min. among my number The min is stored in min[s] -------------------------------------- */ void *worker(void *arg) { int i, s; double my_min; s = * (int *) arg; my_min = x[s]; for (i = s+num_threads; i < MAX; i += num_threads) { if ( x[i] < my_min ) my_min = x[i]; } _min[s] = my_min; return(NULL); /* Thread exits (dies) */ } int main(int argc, char *argv[]) { int i; double my_min; int elapsed; /* ----- Check command line ----- */ if ( argc != 2 ) { printf("Usage: %s Num_Threads\n\n", argv[0]); exit(1); } /* ------------------------- Generate random number ------------------------- */ for (i = 0; i < MAX; i++) x[i] = random()/(double)1147483648; num_threads = atoi(argv[1]); printf("Using %d threads...\n\n", num_threads); gettimeofday(&start_time, NULL); /* ------ Create threads ------ */ for (i = 0; i < num_threads; i = i + 1) { start[i] = i; if ( pthread_create(&tid[i], NULL, worker, (void *)&start[i]) ) { printf("Cannot create thread\n\n"); exit(1); } } for (i = 0; i < num_threads; i = i + 1) pthread_join(tid[i], NULL); my_min = _min[0]; for (i = 1; i < num_threads; i++) if ( _min[i] < my_min ) my_min = _min[i]; gettimeofday(&stop_time, NULL); elapsed = (stop_time.tv_sec*1000000 + stop_time.tv_usec) - (start_time.tv_sec*1000000 + start_time.tv_usec); printf("min = %e\n\n", my_min); printf("Elapsed time = %d microseconds\n\n", elapsed ); }