Difference between revisions of "ProvaTeorica 2012.05.24"
Jump to navigation
Jump to search
Line 53: | Line 53: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
-TomOgn | -TomOgn | ||
+ | |||
+ | |||
+ | <syntaxhighlight lang="C"> | ||
+ | monitor santuario{ | ||
+ | #define ANDATA 0 | ||
+ | #define RITORNO 1 | ||
+ | |||
+ | int waiting[2]; | ||
+ | int crossing[2]; | ||
+ | condition oktoenter[2]; | ||
+ | int count; /* persone dentro al santuario */ | ||
+ | |||
+ | procedure entry entraponte(int dir){ | ||
+ | if (dir == ANDATA){ | ||
+ | if (crossing[1-dir] > 0 || crossing[dir] >= MAXPONTE || cout+crossing[dir] >= MAXSANTUARIO){ | ||
+ | waiting[dir]++; | ||
+ | oktoenter[dir].wait(); | ||
+ | waiting[dir]--; | ||
+ | } | ||
+ | } | ||
+ | else { | ||
+ | if (crossing[1-dir] > 0 || crossing[dir] >= MAXPONTE){ | ||
+ | waiting[dir]++; | ||
+ | oktoenter[dir].wait(); | ||
+ | waiting[dir]--; | ||
+ | } | ||
+ | } | ||
+ | crossing[dir]++; | ||
+ | if ((crossing[dir]+count < MAXSANTUARIO) && crossing[dir] < MAXPONTE) | ||
+ | oktoenter[dir].signal(); | ||
+ | } | ||
+ | |||
+ | procedure entry esciponte(int dir){ | ||
+ | crossing[dir]--; | ||
+ | if (dir == ANDATA){ | ||
+ | count++; | ||
+ | if (count+crossing[dir] < MAXSANTUARIO) /* voi che siete in attesa andate sul ponte */ | ||
+ | oktoenter[dir].signal(); | ||
+ | } | ||
+ | else | ||
+ | count--; | ||
+ | |||
+ | if (crossing[dir] == 0) | ||
+ | oktoenter[1-dir].signal(); | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | Gabriele & Giulia (se non va colpa di Gabriele) |
Revision as of 15:28, 25 March 2014
http://www.cs.unibo.it/~renzo/so/compiti/2012-05-24.tot.pdf
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();
}
}
-TomOgn
monitor santuario{
#define ANDATA 0
#define RITORNO 1
int waiting[2];
int crossing[2];
condition oktoenter[2];
int count; /* persone dentro al santuario */
procedure entry entraponte(int dir){
if (dir == ANDATA){
if (crossing[1-dir] > 0 || crossing[dir] >= MAXPONTE || cout+crossing[dir] >= MAXSANTUARIO){
waiting[dir]++;
oktoenter[dir].wait();
waiting[dir]--;
}
}
else {
if (crossing[1-dir] > 0 || crossing[dir] >= MAXPONTE){
waiting[dir]++;
oktoenter[dir].wait();
waiting[dir]--;
}
}
crossing[dir]++;
if ((crossing[dir]+count < MAXSANTUARIO) && crossing[dir] < MAXPONTE)
oktoenter[dir].signal();
}
procedure entry esciponte(int dir){
crossing[dir]--;
if (dir == ANDATA){
count++;
if (count+crossing[dir] < MAXSANTUARIO) /* voi che siete in attesa andate sul ponte */
oktoenter[dir].signal();
}
else
count--;
if (crossing[dir] == 0)
oktoenter[1-dir].signal();
}
}
Gabriele & Giulia (se non va colpa di Gabriele)