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