diff --git a/Multithreaded_Search/parallel.c b/Multithreaded_Search/parallel.c new file mode 100644 index 0000000000000000000000000000000000000000..242ee99426e20f6a3625965ab92dd2aa2ffb48b0 --- /dev/null +++ b/Multithreaded_Search/parallel.c @@ -0,0 +1,85 @@ +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <pthread.h> +#include <time.h> + +#define SIZE 16 +#define THREADS 4 + +struct arguments{ + + int start; + int end; + int *array; + +}; + +typedef struct arguments arguments_t; + +int get_max(int *array, int start, int end){ + + int max = 0; + for(int i = start; i < end; i++){ + if(array[i] > max){ + max = array[i]; + } + } + return max; +} + +void *worker(void *params){ + arguments_t *args = (arguments_t *) params; + return (void*)(long)get_max(args->array, args->start, args->end);; +} + +int *random_array(int size){ + srand(time(NULL)); + int *random_arr = malloc(size * sizeof(int)); + for(int i = 0; i < size; i++){ + *(random_arr + i) = random(); + } + return random_arr; +} + +void pretty_print(int *arr, int size){ + for(int i = 0; i < size; i++){ + printf("%d\n", *(arr + i)); + } +} + +int main(void){ + int *arr = random_array(SIZE); + pretty_print(arr, SIZE); + int *arr_max = malloc(THREADS*sizeof(int)); + + pthread_t threads[THREADS]; + int len = SIZE/THREADS; + for(int i = 0; i < THREADS; i++){ + arguments_t *arguments = malloc(sizeof(arguments)); + arguments->array = arr; + arguments->start = i*len; + arguments->end =(i == THREADS-1)?(SIZE):(i*len+ len); + printf("from %d to %d\n", arguments->start, arguments->end); + + if(pthread_create(&threads[i], NULL, worker, arguments) != 0){ + perror("CREATE error"); + free(arr); + free(arr_max); + return -1; + } + } + void *ret_ptr = NULL; + for(int i = 0; i < THREADS; i++){ + if(pthread_join(threads[i], &ret_ptr)){ + free(arr); + free(arr_max); + perror("JOIN error"); + return -1; + } + *(arr_max + i) = (long)ret_ptr; + } + pretty_print(arr_max, THREADS); + + return 0; +}