diff --git a/Code_With_Threads/main.c b/Code_With_Threads/main.c new file mode 100644 index 0000000000000000000000000000000000000000..2df062ea2c3ccded639c6daaf4e04a4d34913796 --- /dev/null +++ b/Code_With_Threads/main.c @@ -0,0 +1,180 @@ +#include <stdlib.h> +#include <stdio.h> +#include <stdbool.h> +#include <unistd.h> + +#include <pthread.h> +#include <semaphore.h> + +#include "fonctions.h" + + +FILE *file_in; +FILE *file_out; +char *f_in; +char *f_out; +int number_lines; +int nthreads = 1; +buffer1 *buffer_1; +buffer2 *buffer_2; + +void *reading() { + file_in = fopen(f_in, "r"); + if (file_in == NULL) { + printf("Error with file_in.\n"); + exit(EXIT_FAILURE); + } else { + printf("file_in opened with succes.\n"); + } + + file_out = fopen(f_out, "w"); + if (file_out == NULL) { + printf("Error with file_out.\n"); + exit(EXIT_FAILURE); + } else { + printf("file_out opened with succes.\n"); + } + + int number; + while (fscanf(file_in, "%d", &number) != EOF) { + sem_wait(&(buffer_1->free)); + pthread_mutex_lock(&(buffer_1->mutex)); + put_node_t(buffer_1->numbers, number); + pthread_mutex_unlock(&(buffer_1->mutex)); + sem_post(&(buffer_1->full)); + } + buffer_1->can_stop = true; + + return EXIT_SUCCESS; +} + + +void *calculating() { + while (buffer_1->can_stop == false || buffer_1->numbers->length != 0) { + int number = 0; + sem_wait(&(buffer_1->full)); + pthread_mutex_lock(&(buffer_1->mutex)); + number = get_node_t(buffer_1->numbers); + pthread_mutex_unlock(&(buffer_1->mutex)); + sem_post(&(buffer_1->free)); + + list_t *list_prime = prime_list(number); + + sem_wait(&(buffer_2->free)); + pthread_mutex_lock(&(buffer_2->mutex)); + put_node_lst(buffer_2->prime_numbers, list_prime); + pthread_mutex_unlock(&(buffer_2->mutex)); + sem_post(&(buffer_2->full)); + } + + //clear_list_t(list_prime); + return EXIT_SUCCESS; +} + +void *writing() { + number_lines = count_lines(f_in); + while(number_lines != 0) { + number_lines--; + + sem_wait(&(buffer_2->full)); + pthread_mutex_lock(&(buffer_2->mutex)); + list_t *removed = get_node_lst(buffer_2->prime_numbers); + pthread_mutex_unlock(&(buffer_2->mutex)); + sem_post(&(buffer_2->free)); + + //printf("removed->first = %d\n", get_at_index(removed, 0)); + int length = removed->length; + for (int i = 0; i < length; i++) { + fprintf(file_out, "%d ", get_at_index(removed, i)); + } + clear_list_t(removed); + free(removed); + fprintf(file_out, "\n"); + } + return EXIT_SUCCESS; +} + +int main(int argc, char *argv[]) { + int opt; + while ((opt = getopt(argc, argv, "N:")) != -1) { + switch(opt) { + case 'N': + nthreads = atoi(optarg); + printf("Number of threads : %d.\n", nthreads); + break; + default: + printf("Invalid number of threads.\n"); + break; + } + f_in = argv[optind]; + f_out = argv[optind + 1]; + } + + + buffer_1 = init_buffer_1(nthreads); + if (!buffer_1) { + free(buffer_1); + printf("Error with buffer_1.\n"); + return -1; + } + + buffer_2 = init_buffer_2(nthreads); + if (!buffer_2) { + free(buffer_2); + printf("Error with buffer_2.\n"); + return -1; + } + + pthread_t read; + pthread_t calc[nthreads]; + pthread_t write; + + if (pthread_create(&read, NULL, &reading, NULL) != 0) { + printf("Error with creating reading thread.\n"); + return -1; + } + + for (int i = 0; i < nthreads; i++) { + if (pthread_create(&calc[i], NULL, &calculating, NULL) != 0) { + printf("Error with creating calculating thread.\n"); + return -1; + } + } + + if (pthread_create(&write, NULL, &writing, NULL) != 0) { + printf("Error with creating writing thread.\n"); + return -1; + } + + if (pthread_join(read, NULL) != 0) { + printf("Error with join reading thread.\n"); + return -1; + } + + for (int i = 0; i < nthreads; i++) { + if (pthread_join(calc[i], NULL) != 0) { + printf("Error with join calculating thread.\n"); + return -1; + } + } + + if (pthread_join(write, NULL) != 0) { + printf("Error with join writing thread.\n"); + return -1; + } + + + fclose(file_in); + fclose(file_out); + printf("Files close.\n"); + + clear_list_t(buffer_1->numbers); + free(buffer_1->numbers); + //clear_list_lst(buffer_2->prime_numbers); + free(buffer_2->prime_numbers); + + free(buffer_1); + free(buffer_2); + + return 0; +}