Вы находитесь на странице: 1из 3

ALGORITMO DEL BARBERO DORMILON El problema del barbero durmiente es un problema de sincronizacin; consiste en una barbera en la que trabaja

un barbero, que tiene un nico silln de barbero y varias sillas para esperar. Cuando no hay clientes, el barbero se sienta en una silla y se duerme. Cuando llega un nuevo cliente, ste o bien despierta al barbero o si el barbero est afeitando a otro cliente se sienta en una silla (o se va si todas las sillas estn ocupadas por clientes esperando). El problema consiste en realizar la actividad del barbero sin que ocurran condiciones de carrera. La solucin implica el uso de semforos y objetos de exclusin mutua para proteger la seccin crtica. Un semforo es una variable protegida (o tipo abstracto de datos) que constituye el mtodo clsico para restringir o permitir el acceso a recursos compartidos (por ejemplo, un recurso de almacenamiento) en un entorno de multiprocesamiento. Fueron inventados por Edsger Dijkstra y se usaron por primera vez en el sistema operativo THEOS. En electrnica y en programacin concurrente, se conoce como condicin de carrera al error que se produce en programas o circuitos lgicos que no se han construido adecuadamente para su ejecucin simultnea con otros procesos. Algoritmo de solucin

Solucin al problema del barbero dormiln en lenguaje C


/* Solucion al problema del barbero dormilon. */ #define TRUE1 #define CHAIRS5 typedef struct { int value; /* Lista de procesos. */ } semaphore; semaphore mutex, barber, customer; int waiting = 0; main () { extern semaphore mutex, barber, customer; InitSemaphore (mutex, 1); InitSemaphore (barber, 0); InitSemaphore (customer, 0); /* Inicia los procesos barbero y clientes. */ } void Barber () { while (TRUE) { /* Espera a que haya clientes. */ wait (customer); /* Acceso exclusivo a waiting. */ wait (mutex); /* Un cliente va a ser servido. */ waiting--; /* Un barbero esta libre. */ signal (barber); signal (mutex); /* Corta el pelo fuera de la seccion critica. CutHair (); } } void Customer () { /* Acceso exclusivo a waiting. */ wait (mutex); if (waiting < CHAIRS) { /* Si hay silla espera. */ waiting++; /* Despierta al barbero. */ signal (customer); signal (mutex); /* Se va a dormir si no hay barberos. */ wait (barber); GetHaircut (); } else /* Se va si no hay sitio. */ signal (mutex); }

*/

Вам также может понравиться