Está en la página 1de 9

Programacin de Semforos Mutex en C

Ejemplo 1:
Para el primer ejemplo sobre el caso en que un hilo actualiza un conjunto de items dentro de un
array ponindolos al principio con unos despus con dos y asi sucesivamente, mientras que el otro
hilo tiene que verificar si los items del array son iguales al primer elemento si no fuera lanzara el
error de que no son iguales. Como primera prueba no se descomentaron las lineas las cuales
habilitaban la sincrona y la proteccin de variables compartidas. Es por esto que cuando el segundo
hilo verifique la igualdad de items estos no se cumplir porque el segundo hilo toma posesin
cuando el planificador se lo otorgue sin que el primer hilo llegue a completar su tarea.
Vemos en la consola la primera Prueba.

La Segunda prueba ser habilitando los semforos haciendo posible que le primer proceso complete
su tarea.

ACTIVIDADES:
1.- Escriba el siguiente programa, y luego ejectelo. Describa que es lo que realiza.

Como vemos en la consola se tiene 3 hilos cada uno tiene la tareas de imprimir una p (hilo1)
imprimir una o (hilo2) imprimir una + (hilo3). Despues de que imprima cada uno, estos hilos se
dormiran por un segundo. Tambin existe el hilo proceso main donde se imprime una x pero a
diferencia de los otros, despus de imprimir se duerme por un intervalo de 3 segundos.
Entonces el planificador ver 4 proceso listos para ejecutarse, debido a que no hay control por
semforos, podra asignar la cpu a cualquiera de ellos (por su prioridad) siendo estos [p, o, +, x]. Lo
interesante es que en cada segundo imprime de 4 valores o 3 como mximo los mas impresos sern

los valores p,o,+ pero cada 3 impresiones puede el planificador imprimir la x que esta listo para
poder imprimir. Como el hilo que maneja la impresion de x demora mas en levantarse al final
veremos que ya las impresiones del p, o y + alcanzaron su limite de impresion que es 20 vueltas,
mientras el x queda al final completndose solo, por haber dormido mas tiempo.
2. Modificar el programa anterior para que cada proceso ligero incluyendo la funcin main,
puedan imprimir en pantalla la serie de 20 caracteres correspondiente a cada uno de ellos
sincronizadamente haciendo uso de Mutex.
Se debe mostrar
xxx...(20) oooo...(20)++++....(20)pppp...(20)xxxx.... as sucesivamente.
Para esto debemos tener control sobre cada hilo cuando accede a realizar su tarea de impresin
respectiva. Por ello crearemos un mutex llamado mutexImpresin el cul controle el completado de
las iteraciones, es decir que alcance las 20 impresiones. Cerramos en cada una de los fors de cada
hilo y as el planificador tendr que dejar que complete su tarea.

El ejemplo para un hilo sera el siguiente


Para el caso de la impresin de p sera el siguiente

3. Cul es la funcin del siguiente cdigo?. Explique.


Al principio se dan las funciones que ejecutarn cada hilo vemos que cada uno de ello tiene la tarea
de imprimir el texto con el nombre de la tarea que lleva. Adems se da el control mediante
semforos, pero hay un pequeo detalle, los semforos son mezclados cada uno de los hilos
bloquear su respectivo semforo, pero cuando termine su tarea de impresin no abrir su propio
semforo sino el semforo del vecino, al igual que para el segundo hilo, tambin puede acceder al
desbloqueo del semforo vecino. Esto podra ocasionar que un hilo no permita que el otro hilo se
ejecute asumiendo que una vez abierto el otro hilo cierra y no imprima durante ese intervalo de
tiempo, apoderndose del planificador por un tiempo corto, ya que despus el planificador volver a
darle cabida de cpu al hilo bloqueado.

Aqu vemos la inicializacin por defecto de los atributos de ambos semforos donde servir no
modificar durante el periodo de ejecucin de la tarea los atributos de los semforos. Y la
inicializacin respectiva de los semforos con los atributos ya iniciados por defecto.

Por ltimo los hilos son creados cada uno con su respectiva tarea de impresin, al igual que los
semforos se le inicia tambin atributos del hilo con la funcin pthread_attr_init()

Bsicamente la ejecucin se dar con la impresin alternada si es que planificador otorga por igual
el cpu, donde cada uno imprime su nombre de tarea correspondiente. Esto se har hasta que el
planificador otorgue al main proceso padre, donde se dormir por dos segundos con el objetivo de
que llegue el momento en que el hilo prohba al otro hilo de ejecutar su tarea, apagando su semforo
e imprimiendo doble vez la tarea del semforo que se apodero del planificador por un corto tiempo
hasta que nuevamente el planificador reanude al primer hilo.

4. Elabore un programa del productor-consumidor con hilos


Definimos las variables el semaforo mutex y dos semaforos que tendra la cuenta de vacios y llenos
del buffer inicial.

Para inicializar los valores iniciamos el mutex, creamos un semaforo de llenos y un semaforo de
vaios e iniciamos el contador del buffer a cero ojo el de llenos iniciado a cero, y el vacio iniciado
con todo el espacio del buffer ya que recien se comenzar a llenar.

El hilo para el productor genera un numero aleatorio y hace dormir por es intervalo generado
genera un nmero aleatorio para el elemento a producir e inicia el bloqueo de su mutex. Cuando se
va hacer la insercion o produccin y se levanta el semforo de llenos.

Para el consumidor igualmente se duerme por un intervalo aleatorio y consume uno del semforo
para llenos e inicia el bloqueo del mutex para recin remover el elemento que se va a consumir,
y posteriormente se apertura el mutex nuevamente a su estado normal y se levanta el semforo para
los vacos es decir uno mas para los vacos.

Para el metodo main lo que hacemos es coger por linea de parametros el nro de consumidores y
productores que seran las hilos creados con un iterador. Tambien definimos el tiempo en que durara
la interaccion entre los distintos hilos. Una vez hecho esto y terminar el periodo se termina el
programa.

Salida del programa durante 10 segundos con 50 hilos productores y 10 hilos consumidores.

También podría gustarte