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();
}
}