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( ); } }