resource readerWriter() const int nr = 5 const int nw = 3 const int iter = 10 sem writing = 1 # Sperre für exklusiven Schreibzugriff sem rcount_mutex = 1 # Schutz für readcount int readcount = 0 # Zähler für Leser sem wcount_mutex = 1 # Schutz für writecount int writecount = 0 sem reading = 1 # Sperre für Leser, wenn Schreiber wartet procedure reader_start_cs () { P(reading) # blockiert neue Leser, # falls Schreiber wartet oder Leser bei Anmeldung P(rcount_mutex) if (readcount == 0) { P(writing) } readcount += 1 V(rcount_mutex) V(reading) # damit erster Schreiber nicht blockiert wird } procedure reader_leave_cs () { P(rcount_mutex) readcount -= 1 if (readcount == 0) { V(writing) } V(rcount_mutex) } procedure writer_enter_cs () { P(wcount_mutex) if (writecount == 0) { P(reading) } # Sperre für neue Leser writecount += 1 V(wcount_mutex) P(writing) } procedure writer_leave_cs () { P(wcount_mutex) writecount -= 1 if (writecount == 0) { V(reading) } # Freigabe für Leser V(wcount_mutex) V(writing) } process reader [i = 1 to nr] { int local = 0 for [k = 1 to iter] { reader_start_cs () writes("reader ",i," reads data"); write(); nap(int(random()*10)) reader_leave_cs() # writes("reader ",i," in non-critical section"); write(); nap(int(random()*10)) } } process writer [i = 1 to nw] { for [k = 1 to iter] { # writes("writer ",i," produces data"); write() writer_enter_cs(); nap(int(random()*10)) writes("writer ",i," writes data"); write() writer_leave_cs(); nap(int(random()*10)) } } end readerWriter