Advertisement
Guest User

Untitled

a guest
Feb 18th, 2020
222
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.76 KB | None | 0 0
  1. /*****************************************************************
  2.  
  3.     pour compiler   ==> gcc -pthread prog.c -o prog
  4.     ou      ==> gcc prog.c -o prog -lpthread
  5.    
  6.     Stevens Gagnon
  7.     Departement Informatique
  8.     College Shawinigan
  9.    
  10.  
  11. ******************************************************************/
  12.  
  13. #include <pthread.h>
  14. #include <stdio.h>
  15. #include <string.h>
  16.  
  17.  
  18. //++++++++++++++++++++++++++++++++++++
  19. pthread_mutex_t startThread;
  20. pthread_mutex_t ecriture;
  21. //++++++++++++++++++++++++++++++++++++
  22.  
  23. int nombreRestant = 0;
  24. int nombreTotalDePrime = 0;
  25. //------------------------------------------------------------------
  26.  
  27. void initPremierTXT() //On initialise le fichier texte vide
  28. {
  29.     FILE *fp;
  30.     fp = fopen("./text/premier.txt","w");
  31.     fclose(fp);
  32. }
  33.  
  34. void ecrirePremier(int nombre) //On écrit dans le fichier Premier.txt
  35. {
  36.     FILE *fp;
  37.     fp = fopen("./text/premier.txt","a");
  38.     fprintf(fp,"%d\n",nombre);
  39.     fclose(fp);
  40. }
  41.  
  42.  
  43. int demanderNombre() //Fonction : On demande le nombre à l'usager
  44. {
  45.     int nombre;
  46.     printf("\n Entrez un nombre qui se divise par 3000: ");
  47.     scanf("%d",&nombre);
  48.     return nombre;
  49. }
  50.  
  51. int reduireNombreRestant() //Pour savoir dans quelle tranche on est rendu.
  52. {                          // Exemple: if nombreRestant == 12000, alors on sait où on est
  53.     if(nombreRestant > 0)
  54.     nombreRestant -= 3000;
  55.     return nombreRestant;
  56. }
  57.  
  58. int isPrime(int nombre)
  59. {
  60.     int i, flag = 0;
  61.     for (i = 2; i <= nombre / 2; ++i) {
  62.         // condition for non-prime
  63.         if (nombre % i == 0) {
  64.             flag = 1;
  65.             break;
  66.         }
  67.     }
  68.  
  69.     if (flag == 0)
  70.     {
  71.         return 1; //Retourne 1 si c'est un prime number
  72.     }
  73.     else
  74.     {
  75.         return 0; //Retourne 0 si ce n'est pas un prime number
  76.     }
  77.  
  78.    
  79.     printf("\n");
  80. }
  81.  
  82. int QteDePrime(int nombre, int minimum, int maximum)
  83. {
  84.     printf("\n-----------------------------------------------------------------\n");
  85.     printf("[Pthread: %lu] J'ai trouvé %d nombres premiers dans la page %d à %d",(unsigned long)pthread_self(),nombre,minimum,maximum);
  86.     printf("\n-----------------------------------------------------------------\n");
  87.     nombreTotalDePrime += nombre;
  88. }
  89.  
  90. void FunctionPthread (int *leNombreTotal)
  91. {
  92.     int nombreTotal = *leNombreTotal;
  93.     int i; //on va prendre en compte min et max ici pour l'affichage de QtePrime
  94.     int numberToStartFrom = nombreTotal; //Juste pour rentrer dans la boucle
  95.     int count = 0; //(servira à compter le nombre de primenumbers)
  96.     int min = nombreTotal - 2999;
  97.     int max = nombreTotal;
  98.     reduireNombreRestant(); //Met à jour le NombreRestant
  99.     pthread_mutex_unlock(&startThread);
  100.     if(nombreTotal >= 3000) //On rentre seulement si le nombre de base est plus haut ou egal que 3000, sinon c'est pas une tranche acceptable.
  101.     {
  102.         while(numberToStartFrom > 0) //Tant qu'on pogne pas zero comme minimum, on continue
  103.         {
  104.             numberToStartFrom = nombreTotal - 2999; //On pogne la nouvelle valeur 12000 et fait -2999 = 9001
  105.             for(i = numberToStartFrom;i < nombreTotal;i++) //numberToStartFrom = minimum range
  106.             {                                              // nombreTotal = Maximum range
  107.                 if(isPrime(i))
  108.                 {
  109.                     pthread_mutex_lock(&ecriture);
  110.                     if(i>1)
  111.                     {
  112.                     ecrirePremier(i); //ZONE CRITIQUE
  113.                     count++; // ZONE CRITIQUE
  114.                     }
  115.  
  116.                     pthread_mutex_unlock(&ecriture);
  117.  
  118.                 }
  119.             }
  120.             numberToStartFrom = 0; //On sort de la boucle.
  121.         QteDePrime(count,min,max); //***MANQUE A RAJOUTER L'IDENTIFICATION DU PTHREAD *** Affichage seulement de qte de prime et dans quelle plage.
  122.         }  
  123.     }
  124. }
  125.  
  126.  
  127.  
  128.  
  129. int main(void)
  130. {
  131.     initPremierTXT(); //On fait la fonction qui crée le fichier vide
  132.     int i = 0;
  133.     int nombre = demanderNombre(); //On demande le nombre à l'usager
  134.     nombreRestant = nombre;
  135.     int totalToDivide = nombre/3000; //On trouve ici le nombre de fois qu'on doit partir un thread (un thread par tranche de 3000)
  136.  
  137.  
  138. //++++++++++++++++++++++++++++++++++++//++++++++++++++++++++++++++++++++++++
  139.     pthread_mutex_init(&startThread, NULL); //INITALISE LE MUTEX AVEC LADRESSE COPIE
  140.     pthread_mutex_init(&ecriture, NULL); //INITALISE LE MUTEX AVEC LADRESSE COPIE
  141.     pthread_t thread; // ON CRÉE UN THREAD
  142.     pthread_t list_thread[totalToDivide];    // ON CRÉE UN TABLEAU DE THREADS (POUR EN AVOIR PLUSIEURS)
  143. //++++++++++++++++++++++++++++++++++++//++++++++++++++++++++++++++++++++++++
  144.  
  145.  
  146.  
  147.     for(i = 0; i < totalToDivide;i++) // la boucle qui contient le start d'un thread par tranche de 3000
  148.     {
  149.         printf("\n-----------------------------\n");
  150.         printf("--%i - On start un Pthread--",i+1);
  151.         printf("\n-----------------------------\n");
  152. //++++++++++++++++++++++++++++++++++++//++++++++++++++++++++++++++++++++++++
  153.         pthread_mutex_lock(&startThread);
  154.  
  155.         if(pthread_create(&thread, NULL, (void*)&FunctionPthread, &nombreRestant))   //////////////ON ENVOIT LE THREAD avec l'adresse de la fonction et l'adresse de la variable demo
  156.         {
  157.             printf("Probleme pthread_create\n");
  158.             pthread_mutex_unlock(&startThread);
  159.  
  160.         }
  161.         else
  162.         {
  163.             list_thread[i] = thread; // SI ça LA MARCHÉ AVANT, ON MET LE THREAD DANS LA CASE DU TABLEAU à l'endroit "DEMO"
  164.         }
  165. //++++++++++++++++++++++++++++++++++++//++++++++++++++++++++++++++++++++++++
  166.         //FunctionPthread (nombreRestant);
  167.         //reduireNombreRestant(); //Met à jour le NombreRestant
  168.     }
  169.  
  170.  
  171.  
  172.  
  173.         for(i = 0; i < totalToDivide;i++)     // BOUCLE POUR VENIR ATTENDRE SUR LE THREAD
  174.         {
  175.             thread = list_thread[i];   // ON ASSIGNE A LA VARIABLE THREAD, LE THREAD A LA CASE DU TABLEAU EN COURS
  176.             if(pthread_join(thread, NULL))  // ON VIENT ATTENDRE SUR LE THREAD EN QUESTION, QUAND C'EST FINI LA BOUCLE CONTINU ET ON POGNE LE PROCHAIN.
  177.             {
  178.                 printf("Probleme pthread_join\n");
  179.             }
  180.             else
  181.             {
  182.                
  183.             }
  184.         }
  185.  
  186.  
  187.  
  188.  
  189.  
  190.  
  191.     printf("\n By the way... Il y a %d primes de trouvés en tout\n",nombreTotalDePrime);  
  192. }  
  193.  
  194. //------------------------------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement