Le problème des lecteurs-rédacteursDes lecteurs et des rédacteurs doivent utiliser un même fichier. On a pas de conflit RR mais des conflits WW, RW et WR, ce qui doit engendrer une exclusion mutuelle.
rédacteur |
|
lecteur |
... P(mutexF) ECRITURE V(mutexF) ... |
sema mutexR init 1 mutrexF init 1 |
P(mutexR) nbl++ si nbl = 1 alors P(mutexF) V(mutexR) LECTURE P(mutexR) nbl-- si nbl=0 alors V(mutexF) V(mutexR) |
Afin de paralléliser les lectures, on a ajouté une variable et un sémaphore. On a ainsi construit une priorité faible des lectures (une lecture en cours favorise les lectures qui arrivent). Donc, si on a plein de lecture, l'écriture pourrait ne jamais passer.
Pour obtenir une priorité forte des rédacteurs (lorsqu'un rédacteur se termine, on favorise les lecteurs en attente s'il y en a), on doit créer une deuxième file d'attente. Pour cela on ajoute un autre sémaphore ; prioL init 1.
le rédacteur devient : ... ; P(prioL) ; P(mutexF) ; ECRITURE ; V(mutexF) , V(prioL) ; ... |

|
Pour obtenir une priorité faible des rédacteurs (une écriture en cours favorise les écritures qui arrivent), on reprend l'algorithme précédent en ajoutant deux sémaphores.
rédacteur |
|
lecteur |
P(mutexE) nbr++ si nbr = 1 alors P(mutexBL) V(mutexE) P(mutexF) ECRITURE V(mutexF) P(mutexE) nbl-- si nbr=0 alors V(mutexBL) V(mutexE) |
sema mutexE init 1 mutrexBL init 1 (BL = bloque lecteur) |
P(mutexBL) P(mutexR) nbl++ si nbl = 1 alors P(mutexF) V(mutexR) V(mutexBL) LECTURE P(mutexR) nbl-- si nbl=0 alors V(mutexF) V(mutexR) |
Dans le problème lecteurs / rédacteurs, la solution du double tampon permet d'éviter les conflits entre lectures et écritures. On va supposer que l'on a un seul rédacteur et un ou plusieurs lecteur(s). On a un tampon de deux case ; tp[0] et tp[1]. La variable dernier indique la case ou la dernière valeur à été produite. Pour accéder à ce tampon, on a 2 primitives : lire(tp[j],d) et ecrire(tp[j],d). Les lecteurs accèdent à la dernière case écrite alors que le rédacteur utilise l'autre.
Rédacteur |
Lecteur |
var locale je,d
repeat
calculer une donnée d je := (dernier +1) mod 2 ecrire(tp[je],d) dernier := je
until ... |
var locales jl,d
repeat
jl := dernier lire(tp[jl],d) utiliser(d)
until ... | |