Universidad Nacional de San Antonio Abad del Cusco Departamento Académico de Informática Programación Concurrente y Distribuida Práctica 5 1. OBJETIVO. Ing. Iván Medrano Valencia En esta práctica, comprobaremos el desarrollo y uso de los como otro mecanismo que nos permite realizar sincronización y exclusión mutua entre procesos concurrentes. 2. CONCEPTOS ADICIONALES. El utilizar semáforos para sincronizar procesos presenta dos problemas principales. El primero es que las primitivas se encuentran dispersas por todo el código. El segundo es que los semáforos en sí son un mecanismo difícil de programar y depurar. Un problema crítico en este sentido es que se puede ocasionar deadlock si no se revisa cuidadosamente el código. La necesidad de concentrar el acceso al recurso compartido llevó a Brinch-Hansen y Hoare a desarrollar el concepto de Monitor. La idea del monitor se basa en el principio de Tipo Abstracto de Dato y se define como un conjunto de datos (que representa al recurso crítico) y un conjunto de operaciones que manejan los datos. 3. DESARROLLO DE LA PRACTICA Para implementar los monitores utilizaremos las clases que proporciona el paquete java.util.concurrent.locks aplicado al problema de coches y barcos desarrollado en clases teóricas. IMPLEMENTACION DEL MONITOR /*===== MONITOR PUENTE LEVADIZO ===*/ import java.util.concurrent.locks.*; public class CPuenteLevadizo final ReentrantLock cerrojo = new ReentrantLock(); final Condition okcoche = cerrojo.newcondition(); final Condition okbarco = cerrojo.newcondition(); int c,b; public CPuenteLevadizo() b=0; c=0; public void entrarcoche() throws InterruptedException
while ((b>0) (awaited(okbarco)>0)) //hay barco pasando o esperando //--tiene prioridad los barcos System.out.println("coche esperando..puente ocupado"); okcoche.await(); //el coche espera c++; //--incrementa el número de coches pasando okcoche.signal(); //--despierta si hay otro coche esperando //BAJAR PUENTE public void salircoche() throws InterruptedException System.out.println("coche saliendo..puente libre"); c--; //--disminuye el nro. de coches pasando if (c==0) okbarco.signal(); //--el último coche que pasa //--comunica al barco que puede pasar (si //--hubiera) public void entrarbarco() throws InterruptedException while ((c>0)) //--si hay coches pasando System.out.println("barco esperando..puente ocupado"); okbarco.await(); //--esperar a que pasen los coches b++; //--incrementa el no. de barcos pasando okbarco.signal(); //--despierta a otro barco si hubiera //--para que intente pasar //LEVANTAR PUENTE 2
public void salirbarco() throws InterruptedException System.out.println("barco saliendo..puente libre"); b--; //--disminuye el num. de barcos pasando if(b==0) okcoche.signal(); //-- el último barco comunica al coche //--que espera (si hubiera) que puede intentar pasar private int awaited(condition condicion) //--devuelve el número de hilos que esperan sobre la variable condicion return cerrojo.getwaitqueuelength(condicion); IMPLEMENTACION DE LOS HILOS. public class CCoches extends Thread CPuenteLevadizo puentelevadizo; public CCoches(CPuenteLevadizo p_puentelevadizo) puentelevadizo = p_puentelevadizo; public void run() puentelevadizo.entrarcoche(); //--tratar de pasar el puente System.out.println("ENTRO "+getname()); //---PASAR EL PUENTE sleep(100); puentelevadizo.salircoche(); System.out.println("SALIO "+getname()); catch (InterruptedException e) 3
public class CBarcos extends Thread CPuenteLevadizo puentelevadizo; public CBarcos(CPuenteLevadizo p_puentelevadizo) puentelevadizo = p_puentelevadizo; public void run() puentelevadizo.entrarbarco(); //--tratar de pasar el puente System.out.println("ENTRO "+getname()); //---PASAR EL PUENTE sleep(200); puentelevadizo.salirbarco(); System.out.println("SALIO "+getname()); catch (InterruptedException e) IMPLEMENTACION DE LA APLICACIÓN public class AppCochesBarcos public static void main(string arg[]) //--CREAR EL MONITOR CPuenteLevadizo puentelevadizo = new CPuenteLevadizo(); //--CREAR LOS HILOS A LOS QUE SE PASA COMO PARAMETRO EL MONITOR A UTILIZAR CCoches c1 = new CCoches(puenteLevadizo); CBarcos b1 = new CBarcos(puenteLevadizo); CCoches c2 = new CCoches(puenteLevadizo); CBarcos b2 = new CBarcos(puenteLevadizo); CCoches c3 = new CCoches(puenteLevadizo); CBarcos b3 = new CBarcos(puenteLevadizo); CCoches c4 = new CCoches(puenteLevadizo); CBarcos b4 = new CBarcos(puenteLevadizo); CCoches c5 = new CCoches(puenteLevadizo); CBarcos b5 = new CBarcos(puenteLevadizo); //--PONER NOMBRE A LOS HILOS c1.setname("coche 01"); c2.setname("coche 02"); c3.setname("coche 03"); c4.setname("coche 04"); c5.setname("coche 05"); b1.setname("barco 01"); b2.setname("barco 02"); 4
b3.setname("barco 03"); b4.setname("barco 04"); b5.setname("barco 05"); //--EJECUTAR LOS HILOS c1.start(); b1.start(); c2.start(); b2.start(); c3.start(); b3.start(); c4.start(); b4.start(); c5.start(); b5.start(); EJERCICIOS PARA IMPLEMENTAR EN LABORATORIO Implementar el ejercicio de la autopista que pasa por un puente estrecho. Implementar el ejercicio de los hinchas de futbol. 4. TAREA Implementar el ejercicio del aeropuerto desarrollado en clases teoricas. Se tiene un sistema con tres procesos fumadores y un proceso agente. Cada fumador esta continuamente preparando un cigarrillo y después se lo fuma. Para liar y fumar un cigarrillo, el fumador necesita tres ingredientes: tabaco, papel y fósforos. Uno de los procesos fumadores tiene tabaco, otro papel y el tercero fósforos. El agente tiene una cantidad infinita de los tres materiales. El agente deja dos de los ingredientes en una mesa. El fumador que tiene el ingrediente que falta prepara y se fuma el cigarrillo,, avisándole al agente cuando termina. Entonces el agente pone otros dos de los tres ingredientes en la mesa y el ciclo se repite. Escribir un programa que sincronice al agente y los fumadores. 5. BIBLIOGRAFÍA. Doug Lea Programación Concurrente en Java 2da. Edición. Addison Wesley 2001. Deitel y Deitel JAVA How to Program 3ra. Edición Prentice Hall 1999. Ken Arnold El Lenguaje de Programación JAVA. 3ra. Edición. James Goslin Addison Wesley 2001 David Holmes http://www.oup-usa.org/docs Oxford University Press http://java.sun.com/ Sun MycroSystems. 5