global
  int readcount;
  int writecount;
  mutex mutex1;
  mutex mutex2;
  mutex r;
  mutex w;


reader_begin
    r.enter();
      mutex1.enter();
        readcount.increase();
        if (readcount==1) w.enter();
      mutex1.leave();
    r.leave();

  read();

  mutex1.enter();
    readcount.decrease();
    if (readcount == 0) w.leave();
  mutex1.leave();
reader_end

writer_begin
  mutex2.enter();
    writecount.increase();
    if (writecount==1)  r.enter();
  mutex2.leave();

  w.enter();
    write();
  w.leave();

  mutex2.enter();
    writecount.decrease();
    if (writecount == 0) r.leave();
  mutex2.leave();
writer_end
