commit 9c9b488cb3b557c96f69f3ab1aaf8976d589bf3a Author: Marto Date: Tue Jan 14 17:18:30 2025 +0100 initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ff9047e --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/cmake-build-debug/ diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/PrimeMultiThreading.iml b/.idea/PrimeMultiThreading.iml new file mode 100644 index 0000000..f08604b --- /dev/null +++ b/.idea/PrimeMultiThreading.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/.idea/editor.xml b/.idea/editor.xml new file mode 100644 index 0000000..45a9ffc --- /dev/null +++ b/.idea/editor.xml @@ -0,0 +1,341 @@ + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..2c7451d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..fa5b23b --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,13 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..b63a2db --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..55c949a --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,6 @@ +cmake_minimum_required(VERSION 3.30) +project(PrimeMultiThreading C) + +set(CMAKE_C_STANDARD 23) + +add_executable(PrimeMultiThreading main.c) diff --git a/main.c b/main.c new file mode 100644 index 0000000..5b2b0e0 --- /dev/null +++ b/main.c @@ -0,0 +1,86 @@ +#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); +} \ No newline at end of file