From ba5053af346217ac61311142516f2b29f5dec385 Mon Sep 17 00:00:00 2001 From: adri Date: Thu, 8 Nov 2018 11:47:39 +0100 Subject: [PATCH] Compil&Test ok --- main | Bin 0 -> 20928 bytes main.c | 104 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ main.h | 22 ++++++++++++ main.o | Bin 0 -> 19240 bytes makefile | 9 +++++ 5 files changed, 135 insertions(+) create mode 100755 main create mode 100644 main.c create mode 100644 main.h create mode 100644 main.o create mode 100644 makefile diff --git a/main b/main new file mode 100755 index 0000000000000000000000000000000000000000..418e02928c96f1523039f9b8cc5f9293bb46019b GIT binary patch literal 20928 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 literal 0 HcmV?d00001 diff --git a/main.c b/main.c new file mode 100644 index 0000000..c2bd6bc --- /dev/null +++ b/main.c @@ -0,0 +1,104 @@ +#include +#include +#include //usleep +#include +#include "main.h" + +#define RED "\x1B[31m" +#define GRN "\x1B[32m" +#define YEL "\x1B[33m" +#define BLU "\x1B[34m" +#define MAG "\x1B[35m" +#define CYN "\x1B[36m" +#define WHT "\x1B[37m" +#define RESET "\x1B[0m" + + +#define num_threads 10 +int main(void) { + int nbFinThead = 0;//Compteur de thread qui on fini + pthread_t primes[num_threads]; + pthread_t printArrayPcps_T; + compute_prime_struct** cps = malloc(sizeof(compute_prime_struct*)*(num_threads+1)); + cps[num_threads] = NULL; + int i = 0; + compute_prime_struct *args = malloc(sizeof *args); + args->max_prime = i*i; + args->ith_prime = i; + args->nbFinTheadLoc = nbFinThead; + args->nbFinTheadP = &nbFinThead; + cps[i] = args; + if(i==0 && pthread_create(&printArrayPcps_T, NULL, (void*)printArrayPcps, &cps)) + { + for(;i>=0;i--) + free(cps[i]); + free(cps); + return -1; + } + printf(BLU"Thread printArrayPcps creer\n"RESET); + if(pthread_create(&primes[i], NULL, compute_prime, args)) + { + for(;i>=0;i--) + free(cps[i]); + free(cps); + return -1; + } + printf(BLU"Thread compute_prime %d creer\n"RESET, i); + usleep(1); + i++; + for (; i < num_threads; ++i) + { + compute_prime_struct *args = malloc(sizeof *args); + args->max_prime = i*i; + args->ith_prime = i; + args->nbFinTheadLoc = nbFinThead; + args->nbFinTheadP = &nbFinThead; + cps[i] = args; + if(pthread_create(&primes[i], NULL, compute_prime, args)) + { + for(;i>=0;i--) + free(cps[i]); + free(cps); + return -1; + } + printf(BLU"Thread compute_prime %d creer\n"RESET, i); + usleep(5); + } + pthread_join(printArrayPcps_T, NULL);//On attend que le thread d'impression d'array aie fini + for(int i = 0;iith_prime); + usleep(1000);//args->ith_prime + printf(GRN"LAUNCH compute_prime \t%d\n"RESET,actual_args->ith_prime); + (*(actual_args->nbFinTheadP))++; + ((actual_args->nbFinTheadLoc))++; + printf(GRN"FIN compute_prime \t%d\n"RESET, actual_args->ith_prime); + return 0; +} +void* printArrayPcps(void *** cps) +{ + printf(CYN"Enter in printArrayPcps\n"RESET); + compute_prime_struct **actual_args; + actual_args = (compute_prime_struct **)*cps; + while (*((*actual_args)->nbFinTheadP) < num_threads) + { + printf(YEL"WAIT"CYN" THREAD %d sur %d\n"RESET, *((*actual_args)->nbFinTheadP), num_threads); + usleep(1); + } + printf(CYN"=====LAUNCH printArrayPcps\n"RESET); + while (*actual_args) + { + printf(CYN"max prime %d\t ith prime %d\t Fin thread loc %d\t Fin thread P %d\n"RESET, ((*actual_args)->max_prime), ((*actual_args)->ith_prime),((*actual_args)->nbFinTheadLoc), *((*actual_args)->nbFinTheadP) ); + actual_args++; + } + return 0; +} diff --git a/main.h b/main.h new file mode 100644 index 0000000..fc930b5 --- /dev/null +++ b/main.h @@ -0,0 +1,22 @@ +#ifndef MAIN_H +#define MAIN_H +#include +void * compute_prime (void *args); //thread primaire +void * printArrayPcps(void*** cps); //Threa secondaire +void * pgm(void **param); + +typedef struct{ + int mutex; + WINDOW * win; +} paramNcurseThread; +typedef struct { //struct random pour essayer + int max_prime; + int ith_prime; + int nbFinTheadLoc; //Var local pour voir ou en était le nb de thread + int *nbFinTheadP; //Pointeur pour voir l'interation de mem entre thread + paramNcurseThread * pnt; +} compute_prime_struct; + + + +#endif diff --git a/main.o b/main.o new file mode 100644 index 0000000000000000000000000000000000000000..dda1be093ef395082dec009bbe92367c1c89f72e GIT binary patch literal 19240 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 K{Qu=y>i<6w