Problème des lecteurs rédacteurs avec les moniteurs

Transcription

Problème des lecteurs rédacteurs avec les moniteurs
Problème des lecteurs rédacteurs avec les moniteurs
Dans une base de données, afin de conserver une certaine cohérence, on ne peut pas
– lire pendant une écriture
– écrire pendant une écriture
– écrire pendant une lecture
Les utilisateurs d'une base de données utiliseront les fonctions lecteur et ecrivain respectivement
pour lire et écrire dans la base de données.
lecteur( ){
debut_lire( );
lire(BD);
fin_lire( );
}
ecrivain( ){
debut_ecrire( );
ecrire(BD);
fin_ecrire( );
}
•
On se place dans le cas où l'on donne la priorité aux lecteurs de la base de données.
Il s'agit donc d'implémenter les fonctions debut_lire, fin_lire, debut_ecrire et fin_ecrire
On utilise un moniteur comprotant ces donctions ainsi que les conditions :
cond f_lect , f_ecr
l'entier
int nb_lec
qui indique le nombre de lecteurs dans la base de données,
et enfin le booléen :
bool ecr
qui indique si quelqu'un est en train décrire dans la base de données ou non.
debut_lire( ){
nb_lec ++;
if (ecr){ //s'il y a un écrivain on attend
f_lect.wait( );
}
f_lect.signal( ); // si on peut lire alors tous ceux qui sont en attente aussi
}
fin_lire( ){
nb_lec - - ;
if (nb_lec ==0){
f_ecr.signal( );
}
}
debut_ecrire( ){
if (nb_lec > 0 || ecr){
f_ecr.wait( );
}
ecr = true;
}
fin_ecrire( ){
ecr = false;
if ( nb_lec > 0){ //priorité aux lecteurs : on regarde d'abord si il y en a qui veulent lire
f_lect.signal( );
}
else {
f_ecr.signal( );
}
}
•
On se place maintenant dans le cas où ce sont les écrivains qui ont la priorité
On utilise un moniteur comportant :
int nb_lec_base // compte le nombre de lecteurs dans la base de données
int nb_lec_att
// compte le nombre de lecteurs en attente d'une lecture dans la BD
int nb_ecr_att
// compte le nombre d'écrivains en attente d'écriture
bool ecr_base
// indique si on est en train d'écrire dans la base
cond f_lect , f_ecr
debut_lire( ){
nb_lec_att ++;
if (ecr_base || nb_ecr_att > 0){ //priorité aux écrivains
f_lect.wait( );
}
nb_lec_att --;
l_lect.signal( ); //pareil si on peut lire alors tous les autre en attente de lecture aussi
nb_lec_base ++;
}
fin_lire( ){
nb_lec_base --;
if (nb_lec_base == 0){ //on réveille 1 écrivain
f_ecr.signal( );
}
}
debut_ecrire( ){
nb_ecr_att ++;
if (nb_lec_base > 0 || ecr_base){
f_ecr.wait( );
}
ecr_base = true;
nb_ecr_att --;
}
fin_ecrire( ){
ecr_base = false;
if ( nb_ecr_att >0){
f_ecr.signal( );
}
elsif ( nb_lec_att > 0){
f_lec.signal( );
}
}