Hola Viviane,
En los monitores las funciones se definen con la misma sintaxis que una función normal.
Por ejemplo:
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.