Ejercicio 2

Ejercicio 2

de Gala Victoria Delgado Montero -
Número de respuestas: 3

Hola, tengo una duda en este ejercicio sobre la parte en la que nos piden implementar una función que retorne cada uno de los indicadores.

Lo que hice yo es tener un monitor con los siguientes procedimientos: AgregarModulo, iniciarVerificación, ActualizarCantValidos, LlevarModulo y DevolverDatos. El monitor va guardando la información de los indicadores mencionados en la letra. 

Los primeros 4 procedimientos son utilizados para manejar la lógica del problema, y van aumentando los valores de los indicadores a medida que se agrega otro módulo o se lleva uno al centro especializado, por ejemplo. El quinto procedimiento lo único que hace es retornar los valores de los cuatro indicadores guardados en el monitor, de modo de que si lo llamo desde un función externa obtengo los valores de las variables en el monitor. ¿Esto sería correcto? ¿Los procedimientos de los monitores pueden retornar valores? ¿Cuál sería la sintaxis para retornar?    

A su vez, tengo una duda similar para manejar la cantidad de validados positivamente y negativamente. La función verificar(m) nos devuelve true o false dependiendo de si el modulo se validó positivamente o no, pero esta función no podría ejecutarse dentro del monitor ya que estaría haciendo que no pueda verificarse más de un módulo a la vez. ¿Estaría bien pasar el resultado booleano de esta función (por ejemplo así: monitor.ActualizarCantValidos(ResValidacion) ) para así poder actualizar la cantidad de validos?.

Gracias.

En respuesta a Gala Victoria Delgado Montero

Re: Ejercicio 2

de Santiago Freire Lopez -
Hola Gala,
 
Los monitores pueden tener funciones que devuelvan valores, la sintaxis es la misma que en una función normal. En general hay que tener cuidado cuando se usan valores devueltos por un monitor, ya que la variable dentro del monitor puede cambiar luego de ser devuelta.

El pasaje del resultado de la verificación al monitor parecería ser correcto.

Saludos,
Santiago.
En respuesta a Santiago Freire Lopez

Re: Ejercicio 2

de Viviane Kunin Feder -
Hola, no me quedó claro cual sería la sintaxis para la salida de parámetros a una función de monitor, se pondría con out para indicar que el parámetro es de salida? Por ejemplo RetornarContadores(c1 out int, c2 out int, c3 out int, c4 out int)?

También tenía la duda en general de cuando una función de la letra puede llamarse dentro y cuando fuera para no afectar la concurrencia.
En este caso, por ejemplo sería correcto que el tester hiciera algo como:
Tester(){
while true{
Monitor.recibirModulo() -> espera a tener un modulo disponible
m=obtener;
v=verificar(m);
Monitor.ActualizarContadores(v) -> actualiza los contadores de acuerdo al resultado de v
}
}
Es decir que ejecuta todas las funciones de la letra fuera del monitor.

Y en el caso de el Jefe, es correto que las funciones obtener() y a_centro() de ejecuten dentro del monitor para que no puedan llamarse a otras funciones y continuar agregando módulos mientras este está vaciando la cola? O también se deben ejecutar estas funciones por fuera del monitor para que los testers puedan continuar validando? En este caso debería usar una funcion de moniror antes de ejecutar obtener() y a_centro() para avisar al jefe que debe trabajar y una despues para avisar a los desarrolladores que pueden continuar?

Gracias!
En respuesta a Viviane Kunin Feder

Re: Ejercicio 2

de Santiago Freire Lopez -
Hola Viviane,

En los monitores las funciones se definen con la misma sintaxis que una función normal.

Por ejemplo:

monitor ejemplo;

function aumento_y_devuelvo() : integer;
begin
variable_interna = variable_interna + 1;
return variable_interna;
end;
 
begin
variable_interna = 0;
end;
 
end monitor;
 
Luego un proceso podría llamar a la función del monitor y guardar el valor devuelto: integer variable = ejemplo.aumento_y_devuelvo();
 
Los problemas de concurrencia que mencioné en el mensaje anterior ocurren cuando se utiliza una variable interna del monitor fuera de él, por ejemplo en una condición, porque no hay garantías de que cuando se utilice el valor devuelto el valor dentro del monitor siga siendo el mismo. 
 
Siguiendo con el ejemplo anterior, si un proceso hiciera:
 
integer variable = ejemplo.aumento_y_devuelvo();
if (variable == 50) then
  es_cincuenta();
 
Si es_cincuenta() solo se puede llamar cuando la variable interna del monitor es 50, y hay otros procesos que llaman a ejemplo.aumento_y_devuelvo(), el código anterior sería incorrecto. Entre que el monitor devolvió la variable y el procedimiento evalúa la condición if (variable == 50) otros procesos pueden haber llamado a ejemplo.aumento_y_devuelvo() y el valor dentro del monitor podría no ser 50. No sería un problema si el condicional estuviera en un procedimiento o función dentro del monitor, ya que la variable está mutuoexcluida.
 
También es cierto que si una función se ejecuta innecesariamente dentro del monitor es incorrecto, porque se restringe la concurrencia. Por ejemplo, en este ejercicio si los verificadores ejecutaran verificar dentro del monitor sería incorrecto; primero porque solo se podría verificar un módulo a la vez, y además porque el resto de las llamadas a funciones o procedimientos del monitor tendrían que esperar a que finalice el procedimiento del monitor que contiene verificar() para ejecutar.
 
En el código que pasaste, si está bien o no va a depender de cómo tengas implementado el código del monitor. Si te asegurás de siempre ejecutar obtener cuando hay al menos un módulo disponible puede estar bien, pero tenés que revisar todos los casos bordes.
 
Está bien que el jefe llame a obtener() y a_centro() dentro del monitor, ya que el jefe vacía la cola de módulos pendientes para verificar y los testers no deberían validar los módulos que se van a tercerizar (que son los que podrían obtener) mientras se vacía la cola. Como no se debería llamar a verificar() dento del monitor los testers pueden seguir verificando los módulos obtenidos previamente mientras se terceriza. También se puede hacer otra solución en la que el jefe llame obtener() y a_centro() fuera del monitor pero seguramente te quede un poco más larga.
 
Espero haber resuelto tus dudas y cualquier cosa volvé a escribir.
 
Saludos,
Santiago.