Advertisement
Guest User

Untitled

a guest
Nov 14th, 2019
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.61 KB | None | 0 0
  1.  
  2. #include <stdio.h>
  3. #include <string.h> /* strerror */
  4. #include <unistd.h>
  5. #include <stdlib.h>
  6. #include <errno.h>
  7. #include <fcntl.h>
  8. #include <pthread.h>
  9. #include "LRMonitor.h"
  10.  
  11. #define NB_MAX_LECTEURS 10
  12. #define NB_MAX_REDACTEURS 10
  13. #define NB_LECTURES 5
  14. #define NB_ECRITURES 6
  15.  
  16. // Moniteur de Hoare
  17. LRMonitor m;
  18. int fd;
  19.  
  20. /*---------------------------------------------------------------------*/
  21. void thdErreur(int codeErr, const char *msgErr, void *codeArret) {
  22. /*---------------------------------------------------------------------*/
  23. fprintf(stderr, "%s: %d soit %s \n", msgErr, codeErr, strerror(codeErr));
  24. pthread_exit(codeArret);
  25. }
  26.  
  27. /*---------------------------------------------------------------------*/
  28. void *threadLecteur(void *arg) {
  29. /*---------------------------------------------------------------------*/
  30. int nbLus, i;
  31. int *monNum = (int *)arg;
  32. char unCar;
  33.  
  34. for (i = 0; i < NB_LECTURES; i++) {
  35. // Demander a pouvoir acceder en lecture au fichier partage
  36. m.debutLecture();
  37.  
  38. // Se positionner au debut de fichier
  39. if (lseek(fd, 0, SEEK_SET) < 0)
  40. thdErreur(errno, "Lseek debut fichier", monNum);
  41.  
  42. printf("Lecteur %d: Lecture de :\n", *monNum);
  43. // Lire caractere par caractere jusqu'� fin fichier
  44. // en affichant les caracteres lus
  45. do {
  46. if ((nbLus = read(fd, &unCar, sizeof(char))) < 0)
  47. thdErreur(errno, "Read fichier lecture", monNum);
  48. if (nbLus > 0)
  49. printf("%c", unCar);
  50.  
  51. // Temporiser eventuellement avec usleep() pour perdre du temps
  52. } while (nbLus > 0);
  53. printf("\n");
  54.  
  55. // Signaler la fin de l'acces en lecture au fichier partage
  56. m.finLecture();
  57. }
  58. printf ("Lecteur %d, j'ai fini mon execution \n", *monNum);
  59. pthread_exit(NULL);
  60. }
  61.  
  62. /*---------------------------------------------------------------------*/
  63. void *threadRedacteur(void *arg) {
  64. /*---------------------------------------------------------------------*/
  65. int i, nbEcrits;
  66. int *monNum = (int *)arg;
  67. char monCar = *monNum+65;
  68.  
  69. for (i = 0; i < NB_ECRITURES; i++) {
  70. // Demander a pouvoir acceder en ecriture au fichier partage
  71. m.debutEcriture();
  72.  
  73. // S'appreter a ecrire en fin de fichier
  74. if (lseek(fd, 0, SEEK_END) < 0)
  75. thdErreur(errno, "Lseek fin fichier", monNum);
  76.  
  77. if ((nbEcrits = write(fd, &monCar, 1)) < 0)
  78. thdErreur(errno, "Write fichier", monNum);
  79.  
  80. // Temporiser eventuellement avec usleep() pour prendre plus de temps
  81.  
  82. printf("Redacteur %d: Ecriture de %c \n", *monNum, monCar);
  83.  
  84. // Signaler la fin de l'acces en ecriture au fichier partage
  85. m.finEcriture();
  86. }
  87. printf ("Redacteur %d, j'ai fini mon execution \n", *monNum);
  88. pthread_exit(NULL);
  89. }
  90.  
  91. int main(int argc, char*argv[]) {
  92. /*---------------------------------------------------------------------*/
  93. pthread_t lesLecteurs[NB_MAX_LECTEURS];
  94. pthread_t lesRedacteurs[NB_MAX_REDACTEURS];
  95. int rangLecteurs[NB_MAX_LECTEURS];
  96. int rangRedacteurs[NB_MAX_REDACTEURS];
  97. int nbLecteurs, nbRedacteurs;
  98. int i, etat;
  99.  
  100. if (argc != 3) {
  101. printf("Usage: %s <Nb lecteurs <= %d> <Nb redacteurs <= %d> \n",
  102. argv[0], NB_MAX_LECTEURS, NB_MAX_REDACTEURS);
  103. exit(1);
  104. }
  105.  
  106. nbLecteurs = atoi(argv[1]);
  107. if (nbLecteurs > NB_MAX_LECTEURS)
  108. nbLecteurs = NB_MAX_LECTEURS;
  109.  
  110. nbRedacteurs = atoi(argv[2]);
  111. if (nbRedacteurs > NB_MAX_REDACTEURS)
  112. nbRedacteurs = NB_MAX_REDACTEURS;
  113.  
  114. /* Creation du fichier partage */
  115. if ((fd = open("LectRed_shared", O_RDWR|O_CREAT, 0666)) < 0) {
  116. printf("Erreur ouverture fichier %s\n", strerror(errno));
  117. exit(1);
  118. }
  119.  
  120. /* Lancement des threads lecteurs et redacteurs */
  121. for (i = 0; i < nbLecteurs; i++) {
  122. rangLecteurs[i] = i;
  123. if ((etat = pthread_create(&lesLecteurs[i], NULL,
  124. threadLecteur, &rangLecteurs[i])) != 0)
  125. thdErreur(etat, "Creation lecteurs", NULL);
  126. }
  127.  
  128. for (i = 0; i < nbRedacteurs; i++) {
  129. rangRedacteurs[i] = i;
  130. if ((etat = pthread_create(&lesRedacteurs[i], NULL,
  131. threadRedacteur, &rangRedacteurs[i])) != 0)
  132. thdErreur(etat, "Creation redacteurs", NULL);
  133. }
  134.  
  135. /* Attente de la fin des threads */
  136. for (i = 0; i < nbLecteurs; i++)
  137. if ((etat = pthread_join(lesLecteurs[i], NULL)) != 0)
  138. thdErreur(etat, "Join lecteurs", NULL);
  139.  
  140. for (i = 0; i < nbRedacteurs; i++)
  141. if ((etat = pthread_join(lesRedacteurs[i], NULL)) != 0)
  142. thdErreur(etat, "Join lecteurs", NULL);
  143.  
  144. /* Fermeture du fichier partage */
  145. close(fd);
  146.  
  147. printf ("\nFin de l'execution du main \n");
  148. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement