primes.c (1027B)
1 #include <stdbool.h> 2 #include <pthread.h> 3 4 #define NTHREADS 16 5 6 bool isprime(int); 7 void *pthread_routine(void *); 8 9 struct interval { int low; int high; int count; }; 10 11 int primes_in_range(int low, int high) { 12 pthread_t threads[NTHREADS]; 13 struct interval args[NTHREADS]; 14 15 if (low < 0 || high < low) 16 return 0; 17 18 int interval_size = (high-low)/NTHREADS + 1; 19 for (int i = 0; i < NTHREADS; i++) { 20 args[i].low = low + i*interval_size; 21 args[i].high = args[i].low + interval_size; 22 pthread_create(&threads[i], NULL, pthread_routine, &args[i]); 23 } 24 25 int result = 0; 26 for (int i = 0; i < NTHREADS; i++) { 27 pthread_join(threads[i], NULL); 28 result += args[i].count; 29 } 30 31 return result; 32 } 33 34 bool isprime(int n) { 35 if (n < 2) 36 return false; 37 38 for (int i = 2; i*i <= n; i++) 39 if (n % i == 0) 40 return false; 41 return true; 42 } 43 44 void *pthread_routine(void *arg) { 45 struct interval *interval = arg; 46 47 interval->count = 0; 48 for (int i = interval->low; i < interval->high; i++) 49 if (isprime(i)) 50 interval->count++; 51 52 return NULL; 53 }