Está en la página 1de 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.

Cabe aclarar que la interpretación está basada en pensadores chinos. INTRODUCCIÓN. . quienes comían con dos palillos. 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. donde es más lógico que se necesite el del comensal que se siente al lado para poder comer.

se produce una condición de carrera: ambos compiten por tomar el mismo tenedor. Si cualquier filósofo toma un tenedor y el otro está ocupado. . PLANTEAMIENTO DEL PROBLEMA. entonces todos se quedarán esperando eternamente. y uno de ellos se queda sin comer. hasta que pueda tomar el otro tenedor. Nadie lo hará porque todos se encuentran en la misma situación (esperando que alguno deje sus tenedores). con el tenedor en la mano. Cinco filósofos se sientan alrededor de una mesa y pasan su vida cenando y pensando. 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. para luego empezar a comer. porque alguien debe liberar el tenedor que les falta. Este bloqueo mutuo se denomina interbloqueo deadlock. Entonces los filósofos se morirán de hambre. Si todos los filósofos toman el tenedor que está a su derecha al mismo tiempo. 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. Cada filósofo tiene un plato de fideos y un tenedor a la izquierda de su plato. se quedará esperando. Si dos filósofos adyacentes intentan tomar el mismo tenedor a una vez.

ALGORITMO “CENA DE FILÓSOFOS” .

int comiendo=2. public class cena3 implements Runnable { private int n. . int hambriento=1. t++) { pensar(). for (int t=0. x++. } } } class cenando { int pensando=0.cena(n).out.println(n+"pensando. public cena3(int i. SOLUCIÓN PROPUESTA EN JAVA package sistoper. cenar. } catch (Exception e) { } } public void run() { int x=2. private cenando cenar. } public void pensar() { System.sleep(100+(int)(Math.0)).random()*1000. try { Thread.."). t<x. cenar=dr. cenando dr) { n=i.

try { Thread.println(b+"hambriento").println(d+"Comiendo").pensando}.0)). } private void probar(int p) { if ( estado[p] == hambriento && estado[(p+1)%5] != comiendo&& estado[(p+4)%5] != comiendo) { estado[p]=comiendo. probar(b). probar((i+4)%5).out. soltar(a).pensando. private int[] estado = { pensando. } private synchronized void tomar(int b) { estado[b]=hambriento.sleep(50+(int)(Math.pensando.random()*800. } catch(Exception e) { } } private synchronized void soltar(int i) { estado[i]=pensando.out. private void comer(int d) { System. while ( estado[b] != comiendo ) try { wait(). probar((i+1)%5). } } . } catch (Exception e) { } } public void cena(int a) { tomar(a). System. notifyAll(). comer(a).pensando.

new cena3(4. i++) { new Thread(p[i]).new cena3(3. for (int i=0.length.dr).start(). cena3 p[]={ new cena3(0. i<p.dr) }. public static void main(String args[]) { cenando dr=new cenando(). new cena3(2.new cena3(1. } } } .dr).dr).dr).