Universidad de Costa Rica

Escuela de Ciencias de la Computación e Informática

CI-0122 Sistemas operativos

Ejemplos

CI0122 / Ejemplos / 2014-i


void Monge(){
   m->P();
   if((monge> 0 && canibal>0)|| monge>1){
      printf("LLego un monge \nSe va el barco con monge\n");
      monge--;
      if(canibal== 0){
         monge--;
         mon->V();
         mon->V();

      }
      else{
         canibal--;
         mon->V();
         cani->V();
      }
      m->V();
   }else{
      printf( "Llega un monge \n");
      monge++;
      m->V();
      mon->P();
   }
}

void Canibal(){
   m->P();
   if((monge> 1 && canibal==0) || canibal>1){
      printf("LLego un canibal \nSe va el barco con canibal\n");
      canibal--;
      if(monge<2){
         canibal--;
         cani->V();
         cani->V();

      }
      else{
         monge--;
         mon->V();
         cani->V();
      }
      m->V();
   }else{
      printf( "Llega un canibal \n");
      canibal++;
      m->V();
      cani->P();
   }
}

int main(){
   int monge=0;int canibal=0;
   Semaphore*mon=new Semaphore("Semaforo AguaH",0); //H
   Semaphore*cani=new Semaphore("Semaforo AguaO",0); //O
   Semaphore*m=new Semaphore("Mutex",1);

   for(int i=0;i<20;i++){

      if(rand()%2==0){

         Fork(Monge);
      }
      else{

         Fork(Canibal);
      }
   }
}