Difference between revisions of "Prove svolte e soluzioni proposte"
Jump to navigation
Jump to search
m |
Mattiabiondi (talk | contribs) |
||
Line 1: | Line 1: | ||
Questa pagina serve a raccogliere prove d'esame svolte (che possono essere utili alla preparazione) e soluzioni proposte a tali prove da sottoporre a peer-review. | Questa pagina serve a raccogliere prove d'esame svolte (che possono essere utili alla preparazione) e soluzioni proposte a tali prove da sottoporre a peer-review. | ||
+ | |||
+ | == Esame 17/07/2018 == | ||
+ | === Esercizio c.1 === | ||
+ | <source lang="c"> | ||
+ | /* Monitor Delirum: */ | ||
+ | |||
+ | Condition: Ok2Load; | ||
+ | Condition: Ok2Pour[]; // Un elemento per Type | ||
+ | int availableBeer[]; // Un elemento per Type | ||
+ | Queue requests[]; // Un elemento per Type | ||
+ | Queue pendingRequests; | ||
+ | |||
+ | Procedure entry: void Pour(Type t, Quantity c) | ||
+ | { | ||
+ | if (c > availableBeer[t]) // Richiesta maggiore della birra disponibile | ||
+ | { | ||
+ | c -= availableBeer[t]; | ||
+ | availableBeer[t] = 0; | ||
+ | requests[t].Enqueue(c); | ||
+ | if (requests[t].Length == 1) // Risveglio un magazziniere solo se è la prima richiesta di questo tipo di birra | ||
+ | { | ||
+ | pendingRequests.Enqueue(t); | ||
+ | Ok2Load().Signal(); | ||
+ | } | ||
+ | Ok2Pour[t].Wait(); | ||
+ | requests[t].Dequeue(); // Quando ho ottenuto la birra che voglio, elimino la mia richiesta | ||
+ | } | ||
+ | availableBeer[t] -= c; | ||
+ | } | ||
+ | |||
+ | Procedure entry: Type isEmpty() | ||
+ | { | ||
+ | if (pendingRequests.Length == 0) | ||
+ | { | ||
+ | Ok2Load.Wait(); | ||
+ | } | ||
+ | return pendingRequests.Dequeue(); | ||
+ | } | ||
+ | |||
+ | Procedure entry: Loaded(Type t, Capacity c) | ||
+ | { | ||
+ | availableBeer[t] += c; | ||
+ | while (requests[t].Length > 0 && availableBeer[t] > requests[t].head()) | ||
+ | { | ||
+ | Ok2Pour[t].Signal(); | ||
+ | } | ||
+ | |||
+ | if (requests[t].Length > 0) //serve per evitare che a causa di un magazziniere lento si accodino cosi tante richieste che mentre si sta caricando si svuota subito il fusto | ||
+ | { | ||
+ | pendingRequests.Enqueue(t); | ||
+ | Ok2Load.Signal(); | ||
+ | } | ||
+ | } | ||
+ | </source> |
Revision as of 17:09, 11 April 2019
Questa pagina serve a raccogliere prove d'esame svolte (che possono essere utili alla preparazione) e soluzioni proposte a tali prove da sottoporre a peer-review.
Esame 17/07/2018
Esercizio c.1
/* Monitor Delirum: */
Condition: Ok2Load;
Condition: Ok2Pour[]; // Un elemento per Type
int availableBeer[]; // Un elemento per Type
Queue requests[]; // Un elemento per Type
Queue pendingRequests;
Procedure entry: void Pour(Type t, Quantity c)
{
if (c > availableBeer[t]) // Richiesta maggiore della birra disponibile
{
c -= availableBeer[t];
availableBeer[t] = 0;
requests[t].Enqueue(c);
if (requests[t].Length == 1) // Risveglio un magazziniere solo se è la prima richiesta di questo tipo di birra
{
pendingRequests.Enqueue(t);
Ok2Load().Signal();
}
Ok2Pour[t].Wait();
requests[t].Dequeue(); // Quando ho ottenuto la birra che voglio, elimino la mia richiesta
}
availableBeer[t] -= c;
}
Procedure entry: Type isEmpty()
{
if (pendingRequests.Length == 0)
{
Ok2Load.Wait();
}
return pendingRequests.Dequeue();
}
Procedure entry: Loaded(Type t, Capacity c)
{
availableBeer[t] += c;
while (requests[t].Length > 0 && availableBeer[t] > requests[t].head())
{
Ok2Pour[t].Signal();
}
if (requests[t].Length > 0) //serve per evitare che a causa di un magazziniere lento si accodino cosi tante richieste che mentre si sta caricando si svuota subito il fusto
{
pendingRequests.Enqueue(t);
Ok2Load.Signal();
}
}