# a simple readers and writers simulation # the database is protected using semaphores as in Figure 4.10 # usage: # a.out numReaders numWriters rounds global DataBase op read(var data: int) # read a value op write(val data: int) # write a value body DataBase var database := 0 sem rw := 1, mutexR := 1 var nr := 0 procedure startread() P(mutexR); nr++; if nr = 1 -> P(rw) fi; V(mutexR) end procedure endread() P(mutexR); nr--; if nr = 0 -> V(rw) fi; V(mutexR) end proc read(data) startread(); nap(500); data := database; endread() end proc write(data) P(rw); nap(1000); database := data; V(rw) end end DataBase resource main() import DataBase var numReaders: int; getarg(1, numReaders) var numWriters: int; getarg(2, numWriters) var rounds: int; getarg(3, rounds) process Reader(i := 1 to numReaders) var myvalue: int nap(int(random()*1000)) # to let everybody get created fa j := 1 to rounds -> DataBase.read(myvalue) write("reader", i, "read", myvalue) nap(int(random()*1000)) af end process Writer(i := 1 to numWriters) var myvalue := i nap(int(random()*1000)) # to let everybody get created fa j := 1 to rounds -> DataBase.write(myvalue) write("writer", i, "wrote", myvalue) nap(int(random()*1000)) af end end