Documente Academic
Documente Profesional
Documente Cultură
Un semáforo “es un objeto que limita el número de subprocesos que pueden tener acceso
a un recurso o grupo de recursos simultáneamente” (Microsoft, Inc.). Básicamente,
mediante un semáforo podemos definir cuáles objetos son recursos compartidos, sin
necesidad de utilizar las secciones lock de C#. La siguiente cita textual del sitio de MSDN
explica con detenimiento el funcionamiento de ellos en C#.
“Utilice la clase Semaphore para controlar el acceso a un grupo de recursos. Para entrar
en el semáforo, los subprocesos llaman al método WaitOne, que se hereda de la clase
WaitHandle, y para liberarlo llaman al método Release”.
No hay ningún orden garantizado, como FIFO o LIFO, para la entrada de los subprocesos
bloqueados en el semáforo.
1
Observe el ejemplo 1 de utilización de semáforos, tomado de la biblioteca de ejemplos de
Microsoft MSDN. Si lo desea, puede copiarlo y ejecutarlo en un nuevo proyecto de
aplicación de consola.
Ejemplo 1
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using
System.Threading;
namespace Semaforos
//
// A padding interval to make the output more orderly. private static int
_padding;
2
// concurrent requests. Use an initial count of zero,
//
//
Thread t = new
Thread(new
ParameterizedThreadStart(Worker));
//
t.Start(i);
//
Thread.Sleep(
500);
3
// The main thread starts out holding the entire
// up to three at a time.
//
_pool.Release(3);
// semaphore.
_pool.WaitOne();
4
// about a second. Each thread "works" a little
//
Thread.Sleep(1000 + padding);
num, _pool.Release());
El ejemplo 1 crea un semáforo con 3 “espacios”. El nombre representa el objeto por el cual
se está en espera. Luego inicia subprocesos que se bloquean en espera de la señal del
semáforo. Cuando un objeto llama a la función WaitOne, el proceso detiene su ejecución
hasta que otro subproceso realice la función Release sobre el mismo semáforo. Esto sería
el equivalente a que varios procesos lleguen de forma simultánea a la instrucción/sección
loc de un programa e inician una cola de espera. La señal de un semáforo indica que el
siguiente proceso puede liberarse y seguir trabajando o morir.
5
momento la cuenta de campos del semáforo alcanza cero, éste se bloquea hasta que otro
subproceso libere una entrada en el mismo.
Métod Utilidad
o
de espera.
6
Ejercicio de autoevaluación
Laboratorio
“En una peluquería hay un único barbero, una única silla para cortar el pelo y n sillas para
que los clientes esperen su turno. Usted puede definir el número de sillas de espera a su
gusto. Cuando no hay clientes en la peluquería, el barbero se duerme en la silla de cortar
el pelo. Cuando llega un cliente, debe despertar al barbero y sentarse en la silla para que
le corten el pelo. Si llegan más clientes mientras uno está siendo atendido, deben esperar
7
en las sillas dispuestas para ello. Si no hay más sillas para esperar, el cliente se va.”
Programe la lógica del hilo barbero y a los clientes de forma tal que no se bloqueen y que
no entren en condición de competencia.