Difference between revisions of "ProvaTeorica 2012.05.24"
Jump to navigation
Jump to search
Line 19: | Line 19: | ||
bool toS = true; // direzione di attraversamento del ponte | bool toS = true; // direzione di attraversamento del ponte | ||
− | procedure entry entraponte(bool | + | procedure entry entraponte(bool goingBack) |
{ | { | ||
− | // [Case 1] | + | // [Case 1] La persona vuole tornare indietro |
− | if ( | + | if (goingBack) |
{ | { | ||
/* Se - il numero di persone sul ponte ha raggiunto il massimo; oppure | /* Se - il numero di persone sul ponte ha raggiunto il massimo; oppure | ||
Line 37: | Line 37: | ||
numS--; | numS--; | ||
} | } | ||
− | // [Case 2] | + | // [Case 2] La persona vuole andare al santuario |
else | else | ||
{ | { | ||
Line 55: | Line 55: | ||
} | } | ||
− | procedure entry esciponte(bool | + | procedure entry esciponte(bool goingBack) |
{ | { | ||
numP--; | numP--; | ||
+ | /* Se la persona ha raggiunto il santuario */ | ||
+ | if (!goingBack) | ||
+ | numS++; | ||
+ | |||
/* Se nessuno sta attraversando il ponte */ | /* Se nessuno sta attraversando il ponte */ | ||
if (numP == 0) | if (numP == 0) | ||
{ | { | ||
− | // [Case 1] | + | // [Case 1] L'ultimo ad attraversare tornava indietro |
− | if ( | + | if (goingBack) |
− | /* | + | { |
− | in attesa per | + | /* Se esiste, attivo la persona che per prima si era messa |
− | okP.signal(); | + | in attesa per la direzione opposta */ |
− | // [Case 2] | + | if (waitingP > 0) |
+ | okP.signal(); | ||
+ | else | ||
+ | okS.signal(); | ||
+ | } | ||
+ | // [Case 2] L'ultimo ad attraversare andava al santuario | ||
else | else | ||
{ | { | ||
− | /* | + | /* Se esiste, attivo la persona che per prima si era messa |
− | + | in attesa per la direzione opposta */ | |
− | + | if (waitingS > 0) | |
− | in attesa per | + | okS.signal(); |
− | okS.signal(); | + | else |
+ | okP.signal(); | ||
} | } | ||
} | } |
Revision as of 10:23, 17 March 2014
http://www.cs.unibo.it/~renzo/so/compiti/2012-05-24.tot.pdf
/*
* URL: http://www.cs.unibo.it/~renzo/so/compiti/2012-05-24.tot.pdf
* author: Tommaso Ognibene
*/
monitor santuario
{
condition okP; // andare al santuario
condition okS; // tornare indietro
int numP = 0; // numero di persone sul ponte
int numS = 0; // numero di persone nel santuario
int waitingP = 0; // numero di persone che attendono di andare al santuario
int waitingS = 0; // numero di persone che attendono di tornare indietro
bool toS = true; // direzione di attraversamento del ponte
procedure entry entraponte(bool goingBack)
{
// [Case 1] La persona vuole tornare indietro
if (goingBack)
{
/* Se - il numero di persone sul ponte ha raggiunto il massimo; oppure
- qualcuno sta attraversando il ponte in direzione opposta; oppure
- qualcuno sta attendendo di attraversare nel senso opposto */
if (numP == MAXPONTE || (toS && numP > 0) || waitingP > 0)
{
// Mi fermo e attendo di essere sbloccato
waitingS++;
okS.wait();
waitingS--;
}
numP++;
numS--;
}
// [Case 2] La persona vuole andare al santuario
else
{
/* Se - il numero di persone sul ponte ha raggiunto il massimo; oppure
- il numero di persone nel santuario ha raggiunto il massimo; oppure
- qualcuno sta attraversando il ponte in direzione opposta; oppure
- qualcuno sta attendendo di attraversare nel senso opposto */
if (numP == MAXPONTE || numP + numS == MAXSANTUARIO || (!toS && numP > 0) || waitingS > 0)
{
// Mi fermo e attendo di essere sbloccato
waitingP++;
okP.wait();
waitingP--;
}
numP++;
}
}
procedure entry esciponte(bool goingBack)
{
numP--;
/* Se la persona ha raggiunto il santuario */
if (!goingBack)
numS++;
/* Se nessuno sta attraversando il ponte */
if (numP == 0)
{
// [Case 1] L'ultimo ad attraversare tornava indietro
if (goingBack)
{
/* Se esiste, attivo la persona che per prima si era messa
in attesa per la direzione opposta */
if (waitingP > 0)
okP.signal();
else
okS.signal();
}
// [Case 2] L'ultimo ad attraversare andava al santuario
else
{
/* Se esiste, attivo la persona che per prima si era messa
in attesa per la direzione opposta */
if (waitingS > 0)
okS.signal();
else
okP.signal();
}
}
}
}