diff --git a/Code_With_Threads/main.c b/Code_With_Threads/main.c index b0595b712f94845953fa68f6ce74ee900f48d80d..44b31300de7ff0a55669ff1bc0ae4ee0c6b05805 100644 --- a/Code_With_Threads/main.c +++ b/Code_With_Threads/main.c @@ -2,6 +2,7 @@ #include <stdio.h> #include <stdbool.h> #include <unistd.h> +#include <stdint.h> #include <pthread.h> #include <semaphore.h> @@ -16,6 +17,8 @@ char *f_out; int nthreads = 1; buffer1 *buffer_1; buffer2 *buffer_2; +int nlines1; +int nlines2; void *reading() { @@ -35,8 +38,8 @@ void *reading() { printf("file_out opened with succes.\n"); } - int number; - while (fscanf(file_in, "%d", &number) != EOF) { + uint64_t number; + while (fscanf(file_in, "%lu", &number) != EOF) { sem_wait(&(buffer_1->free)); pthread_mutex_lock(&(buffer_1->mutex)); put_node_t(buffer_1->numbers, number); @@ -53,8 +56,10 @@ void *reading() { void *calculating() { - while (buffer_1->can_stop == false || buffer_1->numbers->length != 0) { - int number = 0; + int nlines1 = count_lines(f_in); + while ((buffer_1->can_stop == false || buffer_1->numbers->length != 0) && nlines1 != 0) { + nlines1 --; + uint64_t number; sem_wait(&(buffer_1->full)); pthread_mutex_lock(&(buffer_1->mutex)); @@ -79,7 +84,9 @@ void *calculating() { } void *writing() { - while(buffer_2->can_stop == false || buffer_2->prime_numbers->length > 0) { + int nlines2 = count_lines(f_in); + while((buffer_2->can_stop == false || buffer_2->prime_numbers->length > 0) && nlines2 != 0) { + nlines2 --; sem_wait(&(buffer_2->full)); pthread_mutex_lock(&(buffer_2->mutex)); @@ -89,7 +96,7 @@ void *writing() { int length = removed->length; for (int i = 0; i < length; i++) { - fprintf(file_out, "%d ", get_node_t(removed)); + fprintf(file_out, "%lu ", get_node_t(removed)); } clear_list_t(removed); free(removed); @@ -158,7 +165,7 @@ int main(int argc, char *argv[]) { printf("Read_thread_join OK.\n"); } - /* + for (int i = 0; i < nthreads; i++) { if (pthread_cancel(calc[i]) != 0) { printf("Error with cancel calculating thread[%d].\n", i); @@ -175,22 +182,6 @@ int main(int argc, char *argv[]) { printf("Calc_thread_join[%d] OK.\n", i); } } - */ - - for (int i = 0; i < nthreads; i++) { - if (pthread_cancel(calc[i]) != 0) { - printf("Error with cancel calculating thread[%d].\n", i); - if (pthread_join(calc[i], NULL) != 0) { - printf("Error with join calculating thread.\n"); - return -1; - } else { - printf("Calc_thread_join[%d] OK.\n", i); - } - } else { - printf("Calc_thread_cancel[%d].\n", i); - } - - } if (pthread_join(write, NULL) != 0) { printf("Error with join writing thread.\n");