[C con Clase] Algoritmo de lectores y escritores

Eduardo Arturo Yauri Mercedes edujava24 en hotmail.com
Lun Jul 2 23:28:00 CEST 2007


Bien , no se si habras visto o escuchado sobre un algoritmo llamado "cena de los filosofos",
bien es una parecico lo que buco se llama ""lectores y escritores". Gracias
 
aca dejo un codigo que encontre en internet, pero la verdad es que no tiene algunos errores:
 
/***************************************************************************//**  Tema    : Implementacion do 1eiro problema de Lectores Escritores    **//**            empregando Semaforos.                                      **//**                                                                       **//**  Data    : 4-Xunho-1997                                               **//***************************************************************************/#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>#include <stdio.h>typedef struct         {          char *Mutex;          char *Delay;          char *Valor;          char *Despertar;         }Semaforo;Semaforo Smut;Semaforo Swrt;char *FichInfo,*DatosPila,*CimaPila;char *Sbinario;int Ler_Disco(NomFich,Posicion)char *NomFich;int Posicion;{int df,Valor;df=open(NomFich,O_CREAT|O_RDONLY,0600);lseek(df,Posicion*sizeof(int),SEEK_SET);read(df,&Valor,sizeof(int));close(df);/*printf("\n Lin o valor: %d  da Posicion %d ",Valor,Posicion);printf("do ficheiro %s ",NomFich);*/return Valor;}void Grabar_Disco(NomFich,Posicion,Dato)char *NomFich;int Posicion;int Dato;{int df,Tino; df=open(NomFich,O_CREAT|O_WRONLY,0600); lseek(df,Posicion*sizeof(int),SEEK_SET); write(df,&Dato,sizeof(int));/* printf("\n Grabei o valor %d na Posicion %d ",Dato,Posicion); printf(" do ficheiro %s ",NomFich);*/ close(df);}/* Implementacion de operacions para Semaforos binarios */void Pb(Nome)char *Nome;{   int df;   while ((df=open(Nome,O_CREAT|O_EXCL,0600))==-1);   close(df);}void Vb(Nome)char *Nome;{ unlink(Nome);}/* Funcion para Insertar Dato na Pila */void InsPila(Dato)int Dato;{int Cima;Cima=Ler_Disco(CimaPila,0);Cima=Cima+1;Grabar_Disco(DatosPila,Cima,Dato);Grabar_Disco(CimaPila,0,Cima);/*printf("\n Inserto na Pila o valor %d na posicion %d",Dato,Cima);*/}/* Ler e Suprimir un dato da Pila */int SuprPila(void){int Cima,Dato;Pb(Sbinario);Cima=Ler_Disco(CimaPila,0);Dato=Ler_Disco(DatosPila,Cima);if (Cima==-1) printf("\n Pila Vacia "); else   {    Grabar_Disco(CimaPila,0,Cima-1);   }Vb(Sbinario);return Dato;}/* Implementacion de Kearns de semaforos Xerales a partir de Sem. binarios */void P(s)  Semaforo s;  { int df,Valor; int Despertar; Pb(s.Mutex); Valor=Ler_Disco(s.Valor,0); Valor=Valor+1; Grabar_Disco(s.Valor,0,Valor); if (Valor<0)    {      Vb(s.Mutex);      Pb(s.Delay);      Pb(s.Mutex);      Despertar=Ler_Disco(s.Despertar,0);      Despertar=Despertar-1;      Grabar_Disco(s.Despertar,0,Despertar);      if (Despertar>0) Vb(s.Delay);     }  Vb(s.Mutex);}void V(s)  Semaforo s;  {  int df,Valor,Despertar;  Pb(s.Mutex);  Valor=Ler_Disco(s.Valor,0);  Valor=Valor+1;  Grabar_Disco(s.Valor,0,Valor);  if (Valor<=0)      {        Despertar=Ler_Disco(s.Despertar,0);         Despertar=Despertar+1;        Grabar_Disco(s.Despertar,0,Despertar);      Vb(s.Delay);      }  Vb(s.Mutex);}/* Primeiro Problema dos Lectores Escritores */void Lector(Sem,Swrt,Num)Semaforo Sem;Semaforo Swrt;int Num;{ int ReadCounter,df,DatoPila; printf("\n O lector %d quere ler un libro ... \n",Num); fflush(stdout); P(Sem); ReadCounter=Ler_Disco(FichInfo,0); ReadCounter=ReadCounter+1; Grabar_Disco(FichInfo,0,ReadCounter); if (ReadCounter==1)  P(Swrt); V(Sem);    printf("\n O Lector %d Consigue Ler o libro da Sabiduria\n",Num);    fflush(stdout);    DatoPila=SuprPila(); P(Sem); ReadCounter=Ler_Disco(FichInfo,0); ReadCounter=ReadCounter-1; Grabar_Disco(FichInfo,0,ReadCounter); if (ReadCounter==0) V(Swrt); V(Sem);}void Escritor(Swrt,Num)Semaforo Swrt;int Num;{sleep(2);printf("\n O Escritor %d intenta que lle publiquen un libro ",Num);P(Swrt);  printf("\n O Escritor %d consigue publicar un libro ",Num);  InsPila(Num);V(Swrt);}main (){/* Inicializo Datos */ int ReadCounter,df; int Valor,Despertar,i; Sbinario="SemPila"; CimaPila="CimaPila"; DatosPila="DatosPila"; FichInfo="FichInfo"; Smut.Mutex="SmutMutex"; Smut.Delay="SmutDelay"; Smut.Valor="SmutValor"; Smut.Despertar="SmutDespertar"; Valor=1; Despertar=0; Swrt.Mutex="SwrtMutex"; Swrt.Delay="SwrtDelay"; Swrt.Valor="SwrtValor"; Swrt.Despertar="SwrtDespertar"; ReadCounter=0; Grabar_Disco(Smut.Valor,0,Valor); Grabar_Disco(Smut.Despertar,0,Despertar); Grabar_Disco(FichInfo,0,ReadCounter); Grabar_Disco(Swrt.Valor,0,Valor); Grabar_Disco(Swrt.Despertar,0,Despertar); unlink(Smut.Mutex); unlink(Swrt.Mutex); unlink(DatosPila); unlink(CimaPila); unlink(Sbinario); df=open(Smut.Delay,O_CREAT|O_WRONLY,0600); close(df); df=open(Swrt.Delay,O_CREAT|O_WRONLY,0600); close(df); Grabar_Disco(CimaPila,0,-1); for (i=1;i<12;i++) InsPila(i);/* Fin Inicializacion de Datos *//* Creo 20 procesos concurrentes : 10 Lectores e 10 Escritores */ if (fork()==0)  Lector(Smut,Swrt,1); else  if (fork()==0)   Lector(Smut,Swrt,2);  else   if (fork()==0)    Escritor(Swrt,1);   else    if (fork()==0)     Lector(Smut,Swrt,3);    else     if (fork()==0)      Escritor(Swrt,2);     else      if (fork()==0)       Escritor(Swrt,3);      else       if (fork()==0)        Lector(Smut,Swrt,4);       else        if (fork()==0)         Lector(Smut,Swrt,5);        else         if (fork()==0)          Lector(Smut,Swrt,6);         else          if (fork()==0)           Escritor(Swrt,4);          else           if (fork()==0)            Lector(Smut,Swrt,7);           else            if (fork()==0)             Lector(Smut,Swrt,8);            else             if (fork()==0)              Escritor(Swrt,5);             else              if (fork()==0)               Escritor(Swrt,6);              else               if (fork()==0)                Escritor(Swrt,7);               else                if (fork()==0)                 Escritor(Swrt,8);                else                 if (fork()==0)                  Escritor(Swrt,9);                 else                  if (fork()==0)                   Escritor(Swrt,10);                  else                   if (fork()==0)                    Lector(Smut,Swrt,9);                   else                    Lector(Smut,Swrt,10);}
_________________________________________________________________
Consigue el nuevo Windows Live Messenger
http://get.live.com/messenger/overview
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20070702/9cca2094/attachment.html>


Más información sobre la lista de distribución Cconclase