Probléme desctruction sémaphore
Bonjour, j'ai un code source qui permet de gérer une fille d'attente pour accéder à 5 guichets. La ressource critique étant les guichets.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| #include <stdio.h>
#include <stdlib.h>
#include "Msem.h"
int guichet ;
int pid ;
void Personne(int);
void Terminaison(void);
main(){
int i ;
guichet = CreerSemaphore(1000,5);
for(i =0; i<4 ; i++) {
if(fork() == 0 ) {
pid = getpid();
Personne(pid);
}
}
Terminaison();
exit(0);
}
void Personne(int pid){
P(guichet);
printf("le client %d entre dans le guichet \n",pid);
fflush(stdout);
srand(pid);
sleep(rand ()%10);
wait(0);
V(guichet);
printf("le client %d libére le guichet \n ", pid) ;
fflush(stdout);
sleep(2);
wait(0);
}
void Terminaison(){
DetruireSemaphore(guichet);
printf("la fille d'attente a ete traitee \n");
fflush(stdout);
} |
Le problème est dans la procédure Terminaison().
le message suivant :
Code:
printf("la fille d'attente a ete traitee \n");
est affiché un peu partout dans le code alors qu'il ne devrai être affiché qu'à la fin de l'exécution.
Citation:
le client 9639 entre dans le guichet
le client 9639 libére le guichet
le client 9640 entre dans le guichet
le client 9641 entre dans le guichet
le client 9642 entre dans le guichet
la fille d'attente a ete traitee
[root@domweb TP2]# le client 9642 libére le guichet
le client 9643 entre dans le guichet
le client 9644 entre dans le guichet
le client 9645 entre dans le guichet
la fille d'attente a ete traitee
la fille d'attente a ete traitee
le client 9640 libére le guichet
le client 9641 libére le guichet
le client 9650 entre dans le guichet
la fille d'attente a ete traitee
le client 9651 entre dans le guichet
le client 9653 entre dans le guichet
la fille d'attente a ete traitee
le client 9643 libére le guichet
le client 9645 libére le guichet
le client 9644 libére le guichet
le client 9651 libére le guichet
le client 9654 entre dans le guichet
la fille d'attente a ete traitee
la fille d'attente a ete traitee
le client 9655 entre dans le guichet
le client 9650 libére le guichet
le client 9656 entre dans le guichet
la fille d'attente a ete traitee
la fille d'attente a ete traitee
le client 9657 entre dans le guichet
la fille d'attente a ete traitee
le client 9655 libére le guichet
la fille d'attente a ete traitee
le client 9653 libére le guichet
le client 9654 libére le guichet
la fille d'attente a ete traitee
le client 9658 entre dans le guichet
la fille d'attente a ete traitee
le client 9656 libére le guichet
le client 9657 libére le guichet
la fille d'attente a ete traitee
la fille d'attente a ete traitee
le client 9658 libére le guichet
la fille d'attente a ete traitee
De plus à la fin de l'exécution je n'ai pas la main alors que l'exécution est fini .
Est ce que qqn aurai une idée la dessus ?