Det problem af læsere og forfattere er et klassisk problem i computer teori , som gør det muligt at modellere adgang til databaser .
Det blev anført i denne form af Edsger Dijkstra , der også er oprindelsen til problemet med filosofernes middag (problem, der især vedrører bestillingen af processerne).
Antag, at en database har læsere og forfattere, og at databasens læsere og forfattere skal programmeres.
Begrænsningerne er som følger:
Det er ret ligetil at have redaktøren sat på vent, mens der stadig er læsere.
Men denne løsning byder på store problemer, hvis strømmen af læsere er regelmæssig: redaktøren kan være nødt til at vente en uendelig tid.
Der er derfor en anden løsning, der består i at sætte alle de læsere, der har sendt deres anmodning om adgang efter en redaktør, på hold.
Edsger Dijkstra , der formulerede dette problem, foreslår at løse det ved hjælp af semaforer .
Den følgende løsning løser problemet med læsere og forfattere ved at prioritere læsere. Denne løsning kræver tre semaforer og en variabel, nemlig:
Denne løsning bruger følgende fire metoder:
Begynd at læse Commencer_Lire: P(M_Lect) SI (red) ALORS pbloque=true V(M_Lect) p(synch) FIN SI SINON lect++; V(M_Lect)Denne metode øger antallet af læsere; så hvis dette er den første læser, der prøver at komme ind, tillader det kun adgang, hvis der ikke er nogen aktuel skrivning. Ellers skal metoden vente, indtil udarbejdelsen er færdig. Brug af to semaforer til redaktørerne gør det muligt at fremkalde prioriteten for læserne.
Afslut en læsning Finir_Lire: P(M_Lect) lect-- SI Lect==0 ALORS V(Red) FIN SI V(M_Lect)Denne metode reducerer antallet af læsere. Derefter, hvis dette er den sidste læser, der afslutter, giver det redaktører adgang til (hvis det er nødvendigt).
Start en skrivning Commencer_Ecrire: P(M_Red) P(Red) SI (red or lect>0) ALORS pbloque=true V(Red) SINON red=true V(Red) V(M_Red)Denne metode ved hjælp af M_Red-semaforen gør det muligt at sikre, at læsere prioriteres i slutningen af en forfatter (faktisk slutningen af en forfatter frigør den røde semafor - hvilket frigør en mulig læser - før at frigøre M_Red-semaforen).
Afslut en skrivning Finir_Ecrire: V(Red) V(M_Red)Denne metode gør det muligt at sikre, at læserne prioriteres (faktisk frigør den røde semafor frigør en mulig læser, inden man frigør en mulig editor ved hjælp af M_Red-semaforen).
Antag, at læsernes mål er at læse data asynkront. Alle læsere har oplysningerne på det tidspunkt, hvor deres anmodning (muligvis fra en ekstern maskine) blev fremsat.
Eller en DATA- markør til en datastruktur, der indeholder alle de tilgængelige oplysninger. Redaktører sender anmodninger, der gemmes i en FIL- kø .
En M1 mutex beskytter følgende struktur:
Liste de DATA : PRECEDENT DATA : ACTUEL DATA : PROCHAIN booléen : MISAJOUREn M2 mutex beskytter følgende struktur:
File de mises à jour : FILE Date de dernière modification : DERNIER Kode udført af læseren verrouille M1: si MISAJOUR est vrai: enfile ACTUEL dans PRECEDENT pour chaque élément de PRECEDENT: effacer l'élément si son compteur de références est nul (1) fin pour ACTUEL := PROCHAIN (2) PROCHAIN := copie de ACTUEL MISAJOUR := faux fin si récupérer un pointeur P sur ACTUEL et incrémenter son compteur de références déverrouille M1 lire dans P ... décrémenter le compteur de références de P Kode udført af forfatteren verrouille M2: enfiler les modifications dans FILE si DERNIER est dépassé de 10 secondes: verrouiller M1: effectuer toute modification de FILE dans PROCHAIN vider FILE MISAJOUR := vrai (3) déverrouille M1 fin si déverrouille M2 BemærkningerDenne model er velegnet, når opdateringerne ikke kræver transaktionsstyring, som databaser skal levere .