-
-
-
CENAPAD-MGCO
A seguir: 3a Questão Acima: Sidney Batista Filho Anterior: 1a. Questao
Clientes - carros:
CBridge Bridge; ... Bridge.RequestPass(ProcessId, Destiny); /* passa pela ponte */ Bridge.ReleasePass();
class CRequest {
CDestiny Destiny;
CBed Bed;
CProcessId ProcessId;
}
class CBridge {
Key Mutex;
CDestiny DestinyNow; // East-> , West<- or null
CQueue Queue;
void RequestPass(CProcessId ProcessId, CDestiny Destiny) {
Lock(Mutex);
CRequest Request = Queue.GetRequest(ProcessId, Destiny);
while(((Destiny != DestinyNow) && (DestinyNow != null)) ||
(!Queue.IsTheBest(Request))) {
Wait(Request.Bed, Mutex);
}
DestinyNow = Destiny;
Queue.Ok(Request);
Wakeup(Queue.Top(Destiny).Bed, Mutex);
Unlock(Mutex);
}
void ReleasePass() {
Lock(Mutex);
if (Queue.Top(DestinyNow) == null) {
DestinyNow = null;
Wakeup(Queue.Top().Bed, Mutex)
}
else Wakeup(Queue.Top(DestinyNou).Bed, Mutex);
Unlock(Mutex);
}
} // CBridge
class CQueue {
COrderedQueue q = new COrderedQueue(new FIFOPlusDestinyComparator());
CRequest GetRequest(CProcessId ProcessId, CDestiny Destiny) {
CRequest Request = new CRequest(ProcessId, Destiny);
q.Put(Request);
return Request;
}
boolean IsTheBest(CRequest Request) {
return (q.Top(Request.Destiny) == Request);
}
boolean Ok(CRequest Request) {
q.Del(Request);
}
CRequest Top(CDestiny Destiny) {
return (CRequest) q.Top(Destiny);
}
CRequest Top(void) {
return (CRequest) q.Top();
}
} // CQueue
Observacoes: