#include #include #include #include #include bool is_prime(const int n) { for (int i = 2; i < n; i++) { if (n % i == 0) { return false; } } return true; } void* aThread(void *ptr) { const int *arr = (int *)ptr; //printf("%d, %d\n", arr[0], arr[1]); const int r = arr[1]-arr[0]; int *n = malloc(r * sizeof(int)); if (n == nullptr) perror("fail"); memset(n, 0, r); int c = 0; for (int i = arr[0]; i < arr[1]; i++) { if (is_prime(i)) { n[c] = i; c++; } } n[c+1] = -1; return n; } int get_threads() { const int num_cores = (int)sysconf(_SC_NPROCESSORS_ONLN); // Logical cores online if (num_cores == -1) { perror("sysconf"); exit(EXIT_FAILURE); } return num_cores; } int main(void) { const int thr_num = get_threads(); constexpr int max_prime = 2000000; const int slice = max_prime / thr_num; pthread_t thread_id[thr_num]; int start = 2; for (int i = 0; i < thr_num; i++) { int *arr = malloc(2 * sizeof(int)); if (arr == nullptr) perror("Failed!"); memset(arr, 0, 2); arr[0] = start; arr[1] = (start + slice) > max_prime ? max_prime : start + slice; pthread_create(&thread_id[i], nullptr, aThread, arr); start = arr[1]; } int c = 0; for (int i = 0; i < thr_num; i++) { void *thread_res = nullptr; pthread_join(thread_id[i], &thread_res); int *result = (int *)thread_res; int prime = 0; for (int t = 0;; t++) { prime = result[t]; if (prime == -1 || prime == 0) break; printf("%d\n", prime); c++; } } printf("Together %d.", c); exit(EXIT_SUCCESS); }