#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); } }