Information Technology Reference
In-Depth Information
//Waituntilnoactiveorwaitingwriters,
//thenproceed.
voidRWLock::startRead()
{
//Waituntilnoactivereadersorwriters
//thenproceed.
voidRWLock::startWrite()
{
lock.Acquire();
waitingReaders++;
while(readShouldWait()){
readGo.Wait(&lock);
lock.Acquire();
waitingWriters++;
while(writeShouldWait()){
writeGo.Wait(&lock);
}
waitingReaders--;
activeReaders++;
lock.Release();
}
waitingWriters--;
activeWriters++;
lock.Release();
}
}
//Donereading.Ifnootheractivereaders,
//awritemayproceed.
voidRWLock::doneRead()
{
//Donewriting.Awaitingwriteorread
//mayproceed.
void
RWLock::doneWrite()
{
lock.Acquire();
activeReaders--;
if(activeReaders==0
&&waitingWriters>0){
writeGo.Signal(&lock);
lock.Acquire();
activeWriters--;
assert(activeWriters==0);
if(waitingWriters>0){
writeGo.Signal(&lock);
}
lock.Release();
}
else{
readGo.Broadcast(&lock);
}
//Readshouldwaitifanyactiveorwaiting
//writer("writerspreferred"solution)
boolRWLock::readShouldWait()
{
}
lock.Release();
}
if(activeWriters>0||waitingWriters>0){
returntrue;
//Writeshouldwaitifanyactivereaderorwriter
bool
RWLock::writeShouldWait()
{
}
returnfalse;
}
if(activeWriters>0||activeReaders>0){
returntrue;
}
returnfalse;
}
Figure5.15: RWLock.cc defines the implementation of our readers/writers
solution
 
Search WWH ::




Custom Search