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;
+}