Difference between revisions of "ProvaTeorica 2012.05.24"

From Sistemi Operativi
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 fromS)
+
procedure entry entraponte(bool goingBack)
 
{
 
{
// [Case 1] la persona parte dal santuario
+
// [Case 1] La persona vuole tornare indietro
if (fromS)
+
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] la persona vuole raggiungere il santuario
+
// [Case 2] La persona vuole andare al santuario
 
else
 
else
 
{
 
{
Line 55: Line 55:
 
}
 
}
  
procedure entry esciponte(bool fromS)
+
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] l'ultimo ad attraversare tornava indietro
+
// [Case 1] L'ultimo ad attraversare tornava indietro
if (fromS)
+
if (goingBack)
/* Attivo la persona che per prima si era messa
+
{
  in attesa per raggiungere il santuario*/
+
/* Se esiste, attivo la persona che per prima si era messa
okP.signal();
+
  in attesa per la direzione opposta */
// [Case 2] l'ultimo ad attraversare andava al santuario
+
if (waitingP > 0)
 +
okP.signal();
 +
else
 +
okS.signal();
 +
}
 +
// [Case 2] L'ultimo ad attraversare andava al santuario
 
else
 
else
 
{
 
{
/* Aggiorno il numero di persone nel santuario */
+
/* Se esiste, attivo la persona che per prima si era messa
numS++;
+
  in attesa per la direzione opposta */
/* Attivo la persona che per prima si era messa  
+
if (waitingS > 0)
  in attesa per tornare indietro */
+
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();
			}
		}
	}
}