Universidad de Costa Rica

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

CI-0122 Sistemas operativos

Ejemplos

CI0122 / Ejemplos


#define capacidad 15

int clientes = 0;
Semaphore mutex("Mutex", 1);
Semaphore cliente("Semaforo C",0);
Semaphore barbero("Semaforo B",0);


void Cliente(void *p){
  // currentThread->Yield();
    long num = (long) p;
    printf("LLega cliente %ld\n",num);
    mutex.P();
    if (clientes == capacidad){
      mutex.V();
      printf("Sala llena, cliente se va sin cortarse el pelo\n");
    }
    else{           //si no esta llena
      printf("Cliente entra\n");
      clientes ++;  //se sienta
      mutex.V();
      cliente.V();
      barbero.P();  //espera a que barbero se despierte

      printf("Cliente %d esta siendo atendido\n", num);
    }
}

void Barbero(void *p){
  while(true) {
      cliente.P(); //revisa si hay clientes, si no se va a dormir
      barbero.V(); //barbero se despierta
      printf("Barbero atendiendo a cliente \n");
      sleep(1);
      mutex.P();
      clientes--;
      mutex.V();
      // currentThread->Yield();

    }
  }

void
ThreadTest()
{
  Thread * t1;
  t1 = new Thread("Barbero empieza a trabajar\n");
  t1->Fork(Barbero,0);
  DEBUG('t', "Haciendo clientes\n");
  char* threadname = new char[100];
  for (long i = 1; i <= 20; i++) {
    Thread * t;
    sprintf(threadname,"Cliente %ld",i);
    t = new Thread(threadname);
    t->Fork(Cliente,(void *)i);
  }
}