martes, 19 de noviembre de 2013

FILOSOFOS COMENSALES

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 o deadlock.

Se genero una soluciona en código C la cual le presentare continuación:

# include < conio.h >
# include < iostream.h >
# include < dos.h >
# include < stdio.h >

main()
{
int op=0,b=0,x,y,ti1=0,td1=0,ti2=0,td2=0,ti3=0,td3=0,ti4=0,td4=0,ti5=0,
td5=0;
do{
clrscr();
gotoxy(2,1);printf("Cena de filosofos");
gotoxy(2,2);printf("Escoge opcion");
gotoxy(2,4);printf("1.-Filosofo 1 9.- Quitar tenedores del filosofo 1");
gotoxy(2,5);printf("2.-Filosofo 2 10.-Quitar tenedores del filosofo 2");
gotoxy(2,6);printf("3.-Filosofo 3 11.-Quitar tenedores del filosofo 3");
gotoxy(2,7);printf("4.-Filosofo 4 12.-Quitar tenedores del filosofo 4");
gotoxy(2,8);printf("5.-Filosofo 5 13.-Quitar tenedores del filosofo 5");
gotoxy(2,10);printf("6.-Simular bloqueo irreversible");
gotoxy(2,11);printf("7.-Dejar de simular bloqueo irreversible");
gotoxy(2,12);printf("8.-Salir");

gotoxy(20,13);printf("1 %d",td1);printf("~(-_-)~");printf("%d",ti1);

if(ti2==0 && td1==0) {
gotoxy(18,14);printf("T");
}else{gotoxy(18,14);printf("0");}

if(td2==0 && ti4==0) {
gotoxy(14,22);printf("T");
}else{gotoxy(14,22);printf("0");}

if(ti1==0 && td3==0) {
gotoxy(36,14);printf("T");
}else{gotoxy(36,14);printf("0");}

if(td5==0 && ti3==0) {
gotoxy(36,22);printf("T");
}else{gotoxy(36,22);printf("0");}

if(td4==0 && ti5==0) {
gotoxy(26,24);printf("T");
}else{gotoxy(26,24);printf("0"); }

gotoxy(12,16);printf(" %d",ti2);
gotoxy(11,17);printf("2 (|)");
gotoxy(10,18);printf(" ( )");
gotoxy(11,19);printf(" (|)");
gotoxy(12,20);printf(" %d",td2);

gotoxy(35,16);printf(" %d",td3);
gotoxy(34,17);printf("3 (|)");
gotoxy(33,18);printf(" ( )");
gotoxy(34,19);printf(" (|)");
gotoxy(35,20);printf(" %d",ti3);

gotoxy(12,25);printf("4 %d",ti4);printf("~(_-_)~");printf("%d",td4);

gotoxy(28,25);printf("5 %d",ti5);printf("~(_-_)~");printf("%d",td5);

gotoxy(10,12);scanf("%d",&op);

switch(op)
{
case 1:

gotoxy(28,28);printf("Intentando levantar Tenedor Izquierdo");
delay(1000);
gotoxy(28,28);printf("Intentando levantar Tenedor Derecho ");
delay(1000);
if(td3==0&&ti2==0)
{ti1=1;td1=1; }else
{gotoxy(28,28);printf("Uno o los dos de los tenedores ya se estan utilizando");
delay(1500);}
break;

case 2:
gotoxy(28,28);printf("Intentando levantar Tenedor Izquierdo");
delay(1000);
gotoxy(28,28);printf("Intentando levantar Tenedor Derecho ");
delay(1000);
if(td1==0&&ti4==0)
{ti2=1;td2=1; }else
{gotoxy(28,28);printf("Uno o los dos de los tenedores ya se estan utilizando");
delay(1500);}
break;

case 3:
gotoxy(28,28);printf("Intentando levantar Tenedor Izquierdo");
delay(1000);
gotoxy(28,28);printf("Intentando levantar Tenedor Derecho ");
delay(1000);
if(ti1==0&&td5==0)
{ti3=1;td3=1; }else
{gotoxy(28,28);printf("Uno o los dos de los tenedores ya se estan utilizando");
delay(1500);}
break;

case 4:
gotoxy(28,28);printf("Intentando levantar Tenedor Izquierdo");
delay(1000);
gotoxy(28,28);printf("Intentando levantar Tenedor Derecho ");
delay(1000);
if(td2==0&&ti5==0)
{ti4=1;td4=1; }else
{gotoxy(28,28);printf("Uno o los dos de los tenedores ya se estan utilizando");
delay(1500);}
break;

case 5:
gotoxy(28,28);printf("Intentando levantar Tenedor Izquierdo");
delay(1000);
gotoxy(28,28);printf("Intentando levantar Tenedor Derecho ");
delay(1000);
if(td4==0&&ti3==0)
{ti5=1;td5=1; }else
{gotoxy(28,28);printf("Uno o los dos de los tenedores ya se estan utilizando");
delay(1500);}
break;

case 6:
b=1;
ti1=1;ti2=1;ti3=1;ti4=1;ti5=1;
break;

case 7:
if(b==1){
ti1=0;ti2=0;ti3=0;ti4=0;ti5=0;
b=0;
}else{ gotoxy(28,28);printf("No se esta simulando un bloqueo irreversible ");
delay(1500);}
break;

case 8:
break;

case 9:
td1=0; ti1=0;
break;
case 10:
td2=0; ti2=0;
break;
case 11:
td3=0; ti3=0;
break;
case 12:
td4=0; ti4=0;
break;
case 13:
td5=0; ti5=0;
break;

default:
gotoxy(20,11);printf("Opcion no disponible");
getch();
break;
}

}while(op!=8);
}





0 comentarios:

Publicar un comentario