Difference between revisions of "ProvaTeorica 2012.05.24"
Jump to navigation
Jump to search
| Line 11: | Line 11: | ||
monitor santuario | monitor santuario | ||
{ | { | ||
| − | + | Go = 0; // andare al santuario | |
| − | + | Back = 1; // tornare indietro | |
| − | + | condition ok[2]; // 2 condizioni | |
| − | + | crossing[2] = {0, 0}; // numero di persone sul ponte | |
| − | + | visiting = 0; // numero di persone nel santuario | |
| − | + | waiting[2] = {0, 0}; // numero di persone in attesa | |
| − | |||
| − | procedure entry entraponte( | + | procedure entry entraponte(dir) |
{ | { | ||
| − | // [ | + | /* Mi blocco se: |
| − | + | - il numero di persone sul ponte ha raggiunto il massimo; oppure | |
| + | - la direzione e' il santuario e il numero di visitatori | ||
| + | (compresi quelli che stanno raggiungendo il santuario) ha raggiunto il massimo; oppure | ||
| + | - qualcuno sta attraversando il ponte in direzione opposta; oppure | ||
| + | - qualcuno sta attendendo di attraversare nel senso opposto */ | ||
| + | if (crossing[dir] == MAXPONTE || | ||
| + | (dir == Go && visiting + crossing[dir] == MAXSANTUARIO) || | ||
| + | crossing[1 - dir] > 0) || | ||
| + | waiting[1 - dir] > 0) | ||
{ | { | ||
| − | + | waiting[dir]++; | |
| − | + | ok[dir].wait(); | |
| − | + | waiting[dir]--; | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
} | } | ||
| + | crossing[dir]++; | ||
| + | |||
| + | if (dir == Back) | ||
| + | visiting--; | ||
} | } | ||
| − | procedure entry esciponte( | + | procedure entry esciponte(dir) |
{ | { | ||
| − | + | crossing[dir]--; | |
| − | + | ||
| − | if ( | + | if (dir == Go) |
| − | + | visiting++; | |
| − | + | ||
| − | / | + | // [Case 1] Nessuno sta attraversando il ponte |
| − | if ( | + | if (crossing[dir] == 0) |
| − | + | ok[1 - dir].signal(); | |
| − | + | // [Case 2] Qualcuno sta attraversando il ponte | |
| − | + | else | |
| − | + | ok[dir].signal(); | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
} | } | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Revision as of 20:47, 24 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
{
Go = 0; // andare al santuario
Back = 1; // tornare indietro
condition ok[2]; // 2 condizioni
crossing[2] = {0, 0}; // numero di persone sul ponte
visiting = 0; // numero di persone nel santuario
waiting[2] = {0, 0}; // numero di persone in attesa
procedure entry entraponte(dir)
{
/* Mi blocco se:
- il numero di persone sul ponte ha raggiunto il massimo; oppure
- la direzione e' il santuario e il numero di visitatori
(compresi quelli che stanno raggiungendo il santuario) ha raggiunto il massimo; oppure
- qualcuno sta attraversando il ponte in direzione opposta; oppure
- qualcuno sta attendendo di attraversare nel senso opposto */
if (crossing[dir] == MAXPONTE ||
(dir == Go && visiting + crossing[dir] == MAXSANTUARIO) ||
crossing[1 - dir] > 0) ||
waiting[1 - dir] > 0)
{
waiting[dir]++;
ok[dir].wait();
waiting[dir]--;
}
crossing[dir]++;
if (dir == Back)
visiting--;
}
procedure entry esciponte(dir)
{
crossing[dir]--;
if (dir == Go)
visiting++;
// [Case 1] Nessuno sta attraversando il ponte
if (crossing[dir] == 0)
ok[1 - dir].signal();
// [Case 2] Qualcuno sta attraversando il ponte
else
ok[dir].signal();
}
}