Difference between revisions of "ProvaTeorica 2012.05.24"
Jump to navigation
Jump to search
| Line 1: | Line 1: | ||
<h1>http://www.cs.unibo.it/~renzo/so/compiti/2012-05-24.tot.pdf</h1> | <h1>http://www.cs.unibo.it/~renzo/so/compiti/2012-05-24.tot.pdf</h1> | ||
| − | + | ||
| + | |||
| + | <syntaxhighlight lang="C"> | ||
| + | /* | ||
| + | * 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 fromS) | ||
| + | { | ||
| + | // [Case 1] la persona parte dal santuario | ||
| + | if (fromS) | ||
| + | { | ||
| + | /* 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 raggiungere il 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 fromS) | ||
| + | { | ||
| + | numP--; | ||
| + | /* Se nessuno sta attraversando il ponte */ | ||
| + | if (numP == 0) | ||
| + | { | ||
| + | // [Case 1] l'ultimo ad attraversare tornava indietro | ||
| + | if (fromS) | ||
| + | /* Attivo la persona che per prima si era messa | ||
| + | in attesa per raggiungere il santuario*/ | ||
| + | okP.signal(); | ||
| + | // [Case 2] l'ultimo ad attraversare andava al santuario | ||
| + | else | ||
| + | { | ||
| + | /* Aggiorno il numero di persone nel santuario */ | ||
| + | numS++; | ||
| + | /* Attivo la persona che per prima si era messa | ||
| + | in attesa per tornare indietro */ | ||
| + | okS.signal(); | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | </syntaxhighlight> | ||
Revision as of 08:49, 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 fromS)
{
// [Case 1] la persona parte dal santuario
if (fromS)
{
/* 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 raggiungere il 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 fromS)
{
numP--;
/* Se nessuno sta attraversando il ponte */
if (numP == 0)
{
// [Case 1] l'ultimo ad attraversare tornava indietro
if (fromS)
/* Attivo la persona che per prima si era messa
in attesa per raggiungere il santuario*/
okP.signal();
// [Case 2] l'ultimo ad attraversare andava al santuario
else
{
/* Aggiorno il numero di persone nel santuario */
numS++;
/* Attivo la persona che per prima si era messa
in attesa per tornare indietro */
okS.signal();
}
}
}
}