`` python
Importer gjenging
Importer tid
Class ReaderWriterLock:
"" "
En skjermløsning for leserforfatterproblemet.
Attributter:
Read_Count (int):Antall lesere som for øyeblikket får tilgang til ressursen.
writ_count (int):Antall forfattere som for øyeblikket får tilgang til ressursen.
lesere_waiting (liste):Liste over lesere som venter på å få tilgang til ressursen.
Forfattere_waiting (liste):Liste over forfattere som venter på å få tilgang til ressursen.
Lås (Threading.Lock):En lås for å beskytte den kritiske delen.
"" "
def __init __ (selv):
self.read_count =0
self.write_count =0
self.readers_waiting =[]
self.writers_waiting =[]
self.lock =threading.lock ()
def anskaffelse_read (self):
"" "
Skaffer seg en leselås.
"" "
med selv.lå:
mens self.write_count> 0 eller self.writers_waiting:
self.readers_waiting.append (threading.current_thread ())
self.lock.release ()
threading.current_thread (). Vent ()
self.lock.acquire ()
self.read_count +=1
def release_read (self):
"" "
Slipper en leselås.
"" "
med selv.lå:
self.read_count -=1
Hvis self.read_count ==0 og self.writers_waiting:
skribent =self.writers_waiting.pop (0)
forfatter.Notify ()
def anskaffelse_write (selv):
"" "
Skaffer seg en skrivelås.
"" "
med selv.lå:
mens self.read_count> 0 eller self.write_count> 0 eller self.writers_waiting:
self.writers_waiting.append (threading.current_thread ())
self.lock.release ()
threading.current_thread (). Vent ()
self.lock.acquire ()
self.write_count +=1
def release_write (self):
"" "
Slipper en skrivelås.
"" "
med selv.lå:
self.write_count -=1
Hvis self.readers_waiting:
leser =self.readers_waiting.pop (0)
leser.notify ()
Klasseleser (Threading.Thread):
"" "
En lesertråd.
"" "
def __init __ (selv, lås):
Super () .__ init __ ()
self.lock =lås
def run (selv):
for _ i rekkevidde (5):
self.lock.acquire_read ()
print (f "Reader {self.name} er lesing")
TID.SLEPP (0,5)
self.lock.release_read ()
print (f "Reader {self.name} ferdig lesing")
Klasseforfatter (Threading.Thread):
"" "
En forfattertråd.
"" "
def __init __ (selv, lås):
Super () .__ init __ ()
self.lock =lås
def run (selv):
for _ i rekkevidde (5):
self.lock.acquire_write ()
print (f "Writer {self.name} er å skrive")
TID.SLEPP (1)
self.lock.release_write ()
print (f "Writer {self.name} ferdig med å skrive")
if __name__ =="__main__":
Lock =ReaderWriterLock ()
lesere =[leser (lås) for _ i rekkevidde (3)]
Forfattere =[forfatter (lås) for _ i rekkevidde (2)]
For leser i leserne:
leser.start ()
For skribent i forfattere:
forfatter.start ()
For leser i leserne:
leser.join ()
For skribent i forfattere:
forfatter.join ()
`` `
Forklaring:
1. `ReaderWriterLock` Class:
- `read_count`,` writ_count`:Sporer antall aktive lesere og forfattere.
- `Readers_Waiting`,` Forfatter_waiting`:lister for å holde tråder som venter på tilgang.
- `Lås`:En mutex for å beskytte den kritiske delen der tellere og lister er endret.
2. `AKVIRE_READ`:
- skaffer seg en leselås:
- Det sjekker først om noen forfattere for øyeblikket får tilgang til eller venter. I så fall blir leseren lagt til listen `Readers_Waiting` og venter.
- Når tilstanden er oppfylt, økes leserens `read_count` økt, noe som betyr at inngangen.
3. `Release_Read`:
- slipper en leselås:
- Decrements the `read_count`.
- Hvis ikke flere lesere er aktive og forfattere venter, varsles den første forfatteren i `Forfattere_waiting`.
4. `AKVIRE_WRITE`:
- skaffer seg en skrivelås:
- Det sjekker først om noen lesere eller forfattere for øyeblikket får tilgang til eller venter. I så fall blir forfatteren lagt til `Forfattere_waiting` og venter.
- Når tilstanden er oppfylt, økes forfatterens `writ_count` økt, noe som betyr at inngangen.
5. `Release_Write`:
- Slipper en skrivelås:
- Decrements the `writ_count`.
- Hvis leserne venter, blir den første leseren i `Readers_Waiting` varslet.
6. `Reader` og` Writer` -klasser:
- Disse klassene representerer leser- og forfattertråder.
- De bruker `ACCIRIRE_READ/ACCIRE_WRITE` og` Release_Read/Release_Write` -metodene for å få tilgang til den delte ressursen.
hvordan det fungerer:
- Monitoren sikrer eksklusiv tilgang til ressursen for forfattere.
- Leserne har lov til å lese samtidig, men ingen leser kan lese mens en forfatter skriver.
- Ventede tråder administreres i køer og varsles når ressursen blir tilgjengelig.
Merk:
- Metoden `Melding ()` brukes til å vekke en ventende tråd.
- Denne koden bruker konseptet med en tilstandsvariabel (underforstått av `vent ()` og `varsle ()` i dette eksemplet) for å håndtere tråd venter og varsel.