
#include <JTC/jtc.h>
#include <iostream.h>

#define MAX 5

// soluzione senza deadlock ma con starvation
class Tavola : public JTCMonitor
{
	bool bacchette[MAX];
	int  numRisvegliAVuoto[MAX];
	
public:
	Tavola()
	{
		for (int i = 0; i < MAX; i++){
			bacchette[i] = false;
			numRisvegliAvuoto[i] = 0;
		}
	}
	void mangia( int nfilosofo ) 
	{
		JTCSynchronized sync(*this);
		while( bacchette[nfilosofo] || 
			   bacchette[(nfilosofo+1) % MAX] ||
			   numRisvegliAVuoto[(nfilosofo - 1) % MAX] > SOGLIA || 
			   numRisvegliAVuoto[(nfilosofo + 1) % MAX] > SOGLIA)
		{
			numRisvegliAVuoto[nfilosofo]++;
			wait();
		}
		numRisvegliAVuoto[nfilosofo] = 0;
		bacchette[nfilosofo] = bacchette[(nfilosofo+1) % MAX] = true;
	}
	void smetti( int nfilosofo )
	{
		JTCSynchronized sync(*this);
		bacchette[nfilosofo] = bacchette[(nfilosofo+1) % MAX] = false;
		notifyAll();
	}
};

class Filosofo : public JTCThread
{
	virtual void run()
	{  
		// riempire a piacimento
	}
};

void main()
{
	// riempire a piacimento
}