Implemente utilizando semáforos una solución a esta variante del problema de los filósofos. Hay F filósofos (F mayor o igual que cinco); y hay P palillos, que se pueden tomar en cualquier orden (no están ordenados circularmente en la mesa). Cuando un filósofo quiere comer, coge un par de palillos cualesquiera y cuando acaba de comer, los devuelve a la mesa.
#include "rshmem.h"
#include <stdlib.h>
#include <sys/sem.h>
#include <math.h>
#include <time.h>
#define N 5 /* tomo 5, como un numero generico de filosofos */
#define M 50 /* numero total de veces que comen los filosofos *
/* Declaracion de la funcion incrementa */
incrementa (int *mem, int k){
int i;
i=*mem;
TP ; TP ; TP TP ;TP ; TP TP ; TP ; TP TP ; TP ;
TP i=i+k;TP ; TP ; TP TP ;TP ; TP TP ; TP ; TP TP ;
TP ; TP
*mem=i;
}
/* Declaracion de la funcion filosofo: uso de semaforos */
filosofo(FILE *pf, key_t *sclave, int *sfilo, int i, int *comer, int *fin, int *fc){
/* ABRIR SEMAFOROS */
/*Abrir semaforo del filosofo de la izquierda del que desea comer */
if (-1==(sfilo[i]=semOpen(sclave[i])))
fprintf(stderr,"no tengo el cualificador del semaforo filosofo %d\n",i);
/*Abrir semaforo del filosofo de la derecha del que desea comer */
if (-1==(sfilo[(i+2)%N]=semOpen(sclave[(i+2)%N])))
fprintf(stderr,"no tengo el cualifacador semaforo filosofo %d\n",(i+2)%N);
while(*comer<M){
semWait(sfilo[i]);
(*fc)++;
if (*fc>(N+1)/2) /* mira si mas de la mitad de los filosofos estan intentando comer */
{
semSignal(sfilo[i]);
(*fc)--;
}
else {
semWait(sfilo[(i+2)%N]);
incrementa(comer,1);
(void) fprintf(pf,"[comer:%.2d] el filosofo %d ha comido\n", *comer, (i+1)%N);
fflush(pf); /* para sincronizar la escritura de datos en el fichero de salida */
semSignal(sfilo[(i+2)%N]);
semSignal(sfilo[i]);
(*fc)--;
}
}semClose(sfilo[i]);
semClose(sfilo[(i+2)%N]);
(*fin)++;
exit(1);
}
int main(){
FILE *pf; /* puntero a fichero salida */
key_t sclave[N+1]; /* array de claves para semaforos */
int sfilo[N]; /* un semaforo por filosofo */
int *comer; /* variable de memoria compartida */
int *fin; /* variable de memoria compartida */
int *fc; /* variable de memoria compartida */
int i; /* contador */
printf("1");
if((pf=fopen("fich", "w+"))==NULL){
fprintf(stderr,"error al abrir el fichero para salidas\n");
exit(-1);
}
printf("abre fichero salida");
for(i=0; i<N; i++){
printf("el for ");
/*crear nombres claves filosofos */
if((key_t)-1==(sclave[i]=ftok("filos",'s'+i))){
fprintf(stderr,"main: error crear clave filosofo %d con ftok(%c)\n", i,'s'+i);
exit(1);
}
/*crear semaforos filosofos */
print("dentro del fo");
if(-1==(sfilo[i]=semCreate(sclave[i],1))){
fprintf(stderr,"main: no pude crear semaforo filosofo %d\n",i);
exit(1);
}
}
printf("hola");
if(!crearMemoria())
fprintf(stderr,"error de crearMemoria()\n");
/*inicializar variable comer y variable fin */
comer = (int *) memoria;
*comer = 0;
fin = (int *) comer + sizeof(int);
*fin = 0;
fc = (int *) comer + sizeof(int);
for(i=0; i<N; i++){
if(0==fork()) /* PROCESOS HIJOS */
filosofo(pf, sclave, sfilo, i, comer, fin, fc);
}
while(*fin<5); /*espera a que los filosofos coman M veces */
fprintf(pf,"no habia comido ningun filososo y ahora han comido %d", *comer);
fclose(pf); /* eliminar memoria de las variables compartidas */
if(!eliminarMemoria())
fprintf(stderr,"error de eliminarMemoria()\n");/* cerrar semaforos */
for(i=0; i<N; i++)
semClose(sfilo[i]);
exit(0);
} /*fin proceso padre, fin main */
No hay comentarios:
Publicar un comentario