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