Buenas. Me quedan algunas dudas sobre la solución de este problema.
En la letra se dice que "una vez finalizada la carga por parte de los vehículos, estos deberán dirigirse a la caja con menos vehículos esperando para pagar y allí realizar el pago", lo que da a entender que los vehículos esperan en una fila para pagar. Sin embargo, entiendo que en la solución se asume que no hay filas en las cajas ya que cuando un procedimiento AUTO invoca al procedimiento pagar_combustible(), este le asigna una caja (con la función cobrar_empezar() del monitor admin_cajas) e inmediatamente se llama al procedimiento pagar(), que asumo que ahí hubo un error y se está queriendo a cobrar() del monitor caja. En cobrar() lo que se hace es directamente invocar a cobrar_combustible(), no se hace ningún wait() en una condition del monitor caja que bloquearía a los procedimientos que quieran cobrar si es que hay otros que llegaron antes y también están esperando.
También tengo otra consulta con respecto a la parte de recargar el tanque de nafta, para lo cual se dice en la letra que mientras se esté recargando el tanque no pueden haber autos abasteciéndose. Supongamos que ocurren los siguientes pasos (mirando el código de la solución):
1. Se llama a recargar_gran_tanque()
2. Se ejecutan las primeras 2 iteraciones del for dentro de recargar_gran_tanque()
3. Se le saca la CPU al procedimiento que invocó a recargar_gran_tanque() y se le da la CPU a un procedimiento que invoca a cargar() en el tercer surtidor. Al evaluar "if(carga_gt)" le da falso entonces no entra al if y llama a surtir_combustible().
4. Se le saca la CPU a este procedimiento y se la devuelve al primero (al que había invocado a recargar_gran_tanque())
5. Se ejecuta la tercera iteración del for y se invoca a llenar_gran_tanque()
En este momento se va a estar llenando el gran tanque y a su vez va a haber un auto cargando combustible en el tercer surtidor.
No se si hay algo en mi razonamiento que esté mal para estas partes o si entendí mal la letra. Les agradezco si me pueden ayudar.
Saludos!