| Chapitre 5 : Les mécanismes de synchronisation |
Problème de Lecteurs-Rédacteurs
type Lecteurs_Rédacteurs = Moniteur
Var
Booléen Ecriture ;
Int Nombre_Lecteurs ;
Condition Accord_Lecture, Accord_Ecriture ;
void Debut_Lecture()
{
Si (Ecriture) Ou ! (Accord_Ecriture.Vide()) Accord_Lecture.Wait ;
Nombre_Lecteurs = Nombre_Lecteurs + 1 ;
Accord_Lecture.Signal ;
}
viod Fin_Lecture()
{
Nombre_Lecteurs = Nombre_Lecteurs - 1 ;
Si (Nombre_Lecteurs == 0) (Accord_Ecriture.Signal) ;
}
void Debut_Ecriture()
{
Si (Nombre_Lecteurs > 0) Ou (Ecriture) Accord_Ecriture.Wait ;
Ecriture = Vrai ;
}
void Fin_Ecriture()
{
Ecriture = Faux ;
Si ! (Accord_Lecture.Vide()) Accord_Lecture.Signal ;
Sinon Accord_Ecriture.Signal ;
}
{
Ecriture = Faux ;
Nombre_Lecteurs = 0 ;
}
Lecteur
{
.....
.....
While(1)
{
Debut_Lecture() ;
Fich.Lire(...) ;
Fin_Lecture() ;
}
}
Rédacteur
{
.....
.....
While(1)
{
Debut_Ecriture() ;
Fich.Ecrire(...) ;
Fin_Ecriture() ;
}
}
Remarques :
La solution présentée est conforme aux règles suivantes