-
-
-
CENAPAD-MGCO
A seguir: 4a. Questão Acima: Marcelo Bernardes Vieira Anterior: 2a. Questão
Considerações iniciais:
a) Programa cliente:
void escritor() { void Leitor() {
RequestWrite(); RequestRead();
... ...
ReleseWrite(); ReleseRead();
} }
b) Controlador leitor/escritor:
key mutex; RWQueue waiting; Bed b;
int nw = 0, nr = 0, flushread = 0;
void RequestWrite() {
lock(mutex);
int myticket = waiting.GetTicket(WRITE);
if(flushread == 0) waiting.PromoteWrite();
while( !waiting.IsTheBest(myTicket) || nw > 0 || nr > 0) {
wait(b, mutex);
}
nw++;
waiting.ok(myticket);
unlock(mutex);
unlock(mutex);
}
void RequestRead() {
lock(mutex);
int myticket = waiting.GetTicket(READ);
while(!waiting.IsTheBest(myticket) || nw > 0) {
wait(b, mutex);
}
if(flushread > 0) flushread--;
nr++;
waiting.Ok(myticket);
wakeup(b, mutex);
unlock(mutex);
}
void ReleaseWrite() {
lock(mutex);
flushread = waiting.PromoteRead();
nw--;
wakeup(b, mutex);
unlock(mutex);
}
void ReleaseRead() {
lock(mutex);
nr--;
wakeup(b, mutex);
unlock(mutex);
}
c) Fila de prioridades:
int ticket = 0; Queue q;
int GetTicket(int tipo) {
q.Put(++ticket, tipo);
return( ticket );
}
boolean IsTheBest(int ticket) {
return( q.top == NULL || q.top == ticket);
}
void Ok(int ticket) {
q.Del(ticket);
}
int PromoteRead() {
// Coloca todos os processos de leitura no topo
// obedecendo a ordem de chegada e retornando
// o n\'{u}mero de leitores que est\~{a}o no topo
}
int PromoteWrite() {
// Coloca todos os processos de escrita no topo
// obedecendo a ordem de chegada
}