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