
Solution to the Readers and Writers problem using Monitors

Monitors can be used to restrict access to the database. In this example, the read and write functions used by processes which access the database are in a monitor called ReadersWriters. If a process wants to write to the database, it must call the writeDatabase function. If a process wants to read from the database, it must call the readDatabase function.
Remember that monitors use the primitives Wait and Signal to put processes to sleep and to wake them up again. In writeDatabase, the calling process will be put to sleep if the number of reading processes, stored in the variable count, is not zero. Upon exiting the readDatabase function, reading processes check to see if they should wake up a sleeping writing process.
monitor ReadersWriters
condition OKtoWrite, OKtoRead;
int ReaderCount = 0;
Boolean busy = false;
procedure StartRead()
{
if (busy) // if database is not free, block
OKtoRead.wait;
ReaderCount++; // increment reader ReaderCount
OKtoRead.signal();
}
procedure EndRead()
{
ReaderCount-- ; // decrement reader ReaderCount
if ( ReaderCount == 0 )
OKtoWrite.signal();
}
procedure StartWrite()
{
if ( busy || ReaderCount != 0 )
OKtoWrite.wait();
busy = true;
}
procedure EndWrite()
{
busy = false;
If (OKtoRead.Queue)
OKtoRead.signal();
else
OKtoWrite.signal();
}
Reader()
{
while (TRUE) // loop forever
{
ReadersWriters.StartRead();
readDatabase(); // call readDatabase function in monitor
ReadersWriters.EndRead();
}
}
Writer()
{
while (TRUE) // loop forever
{
make_data(&info); // create data to write
ReaderWriters.StartWrite();
writeDatabase(); // call writeDatabase function in monitor
ReadersWriters.EndWrite();
}
}
![]()
![]()
![]()
![]()
IPC Home Subway Problems Readers/ Message Page Map Writers Passing