You are on page 1of 7

CENA DE FILÓSOFOS

Hay cinco filósofos chinos que se pasan sus vidas
pensando y comiendo. Comparten una mesa circular,
alrededor de la cual se sientan. En su centro se encuentra
con una provisión infinita de arroz, y sobre ella hay cinco
palitos, uno de cada lado de los filósofos. Cuando un
filósofo piensa, no interactúa con sus colegas

CHIRINO ALVARADO CARLA RUBI.
GOMEZ LOPEZ ERICK RAUL.
VAZQUEZ ALVAREZ ELENA IVETTE.
VILLATORO CONSTANTINO LUIS EDUARDO.
INTRODUCCIÓN.

El problema de los filósofos cenando es un problema clásico de las ciencias de la
computación propuesto por Edsger Dijkstra en 1965 para representar el problema de la
sincronización de procesos en un sistema operativo. Cabe aclarar que la interpretación está
basada en pensadores chinos, quienes comían con dos palillos, donde es más lógico que se
necesite el del comensal que se siente al lado para poder comer.
PLANTEAMIENTO DEL PROBLEMA.

Cinco filósofos se sientan alrededor de una mesa y pasan su vida cenando y pensando. Cada
filósofo tiene un plato de fideos y un tenedor a la izquierda de su plato. Para comer los fideos son
necesarios dos tenedores y cada filósofo sólo puede tomar los que están a su izquierda y derecha.
Si cualquier filósofo toma un tenedor y el otro está ocupado, se quedará esperando, con el
tenedor en la mano, hasta que pueda tomar el otro tenedor, para luego empezar a comer.

Si dos filósofos adyacentes intentan tomar el mismo tenedor a una vez, se produce una condición
de carrera: ambos compiten por tomar el mismo tenedor, y uno de ellos se queda sin comer.

Si todos los filósofos toman el tenedor que está a su derecha al mismo tiempo, entonces todos se
quedarán esperando eternamente, porque alguien debe liberar el tenedor que les falta. Nadie lo
hará porque todos se encuentran en la misma situación (esperando que alguno deje sus
tenedores). Entonces los filósofos se morirán de hambre. Este bloqueo mutuo se denomina
interbloqueo deadlock, que no es más que el bloqueo permanente de un grupo de procesos. El
problema consiste en encontrar un algoritmo que permita que los filósofos nunca se mueran de
hambre.
ALGORITMO “CENA DE FILÓSOFOS”
SOLUCIÓN PROPUESTA EN JAVA

package sistoper;

public class cena3 implements Runnable
{

private int n;
private cenando cenar;

public cena3(int i, cenando dr)
{
n=i;
cenar=dr;
}
public void pensar()
{
System.out.println(n+"pensando..");
try
{
Thread.sleep(100+(int)(Math.random()*1000.0));
}
catch (Exception e)
{

}
}
public void run()
{
int x=2;
for (int t=0; t<x; t++)
{
pensar();
cenar.cena(n);
x++;
}
}

}
class cenando
{

int pensando=0;
int hambriento=1;
int comiendo=2;
private int[] estado = {
pensando,pensando,pensando,pensando,pensando};

private void comer(int d)
{
System.out.println(d+"Comiendo");
try
{
Thread.sleep(50+(int)(Math.random()*800.0));
}
catch (Exception e)
{

}
}
public void cena(int a)
{
tomar(a);
comer(a);
soltar(a);
}
private synchronized void tomar(int b)
{
estado[b]=hambriento;
System.out.println(b+"hambriento");
probar(b);
while ( estado[b] != comiendo )
try
{
wait();
}
catch(Exception e)
{

}
}
private synchronized void soltar(int i)
{
estado[i]=pensando;
probar((i+4)%5);
probar((i+1)%5);
}
private void probar(int p)
{
if ( estado[p] == hambriento && estado[(p+1)%5] !=
comiendo&& estado[(p+4)%5] != comiendo)
{
estado[p]=comiendo;
notifyAll();
}
}
public static void main(String args[])
{
cenando dr=new cenando();
cena3 p[]={ new cena3(0,dr),new cena3(1,dr), new
cena3(2,dr),new cena3(3,dr), new cena3(4,dr) };
for (int i=0; i<p.length; i++)
{
new Thread(p[i]).start();

}

}
}