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 procedure reader_start_cs () { P(rcount_mutex) if (readcount == 0) { P(writing) } readcount += 1 V(rcount_mutex) } procedure reader_leave_cs () { P(rcount_mutex) readcount -= 1 if (readcount == 0) { V(writing) } V(rcount_mutex) } procedure writer_enter_cs () { P(writing) } procedure writer_leave_cs () { 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