Nombre: Belinche Gianluca Ernesto
Padrón: 102674
En este trabajo se genero una solución al problema de simular el comportamiento de un pequeño poblado. Para lograrlo se uitilizo un modelo que será descripto a continuación:
Debido al tamaño del modelo, se lo separara en distintas partes, para su mas facil explicación.
Desde el punto de vista del usuario, solo se posee el conocimiento de las siguiente clases:
- ColaBloqueante
- Inventario
- ParseadorTrabajadores
- ParseadorMateriasPrimas
- PuntosDeBeneficio
- ManejadorTrabajadores
Pasare a explicar cada uno de ellos,
La ColaBloqueante se encarga de repartir recursos, con un modelo FIFO, que además implementa un mutex y una condition variable, lo cual permite que distintos threads puedan acceder a ella sin generar race conditions, y gracias a la condition variable, se logra optimizar la entrada de los threads, notificandolos en cuanto un nuevo recurso es encolado.
El inventario permite almacenar los distintos recursos, donde los Recolectores son los encargados de almacenarlos, y los Productores de utilizarlos, (estas dos clases se explicaran mas adelante), también se utiliza un mutex y una condition variable, para que no se superpongan los distintos almacenamientos y extracciones de recursos.
La ultima clase con un mecanismo similar a las dos anteriores es PuntosDeBeneficio, que internamente es un contador que dependiendo de que productor lo llame, aumenta en un numero diferente de puntos, de nuevo, tambien utiliza mutex y condition variable para su correcta utilización.
Luego tenemos dos clases, ParseadorTrabajadores y ParseadorMateriasPrimas, estas se encargan de parsear los archivos correspondientes, la primera obtiene las cantidades de cada trabajador, mientras que la segunda va leyendo el archivo de los recursos, y dependiendo que recurso sea, lo va encolando en la ColaBloqueante que corresponda.
Por ultimo en este apartado, esta la clase ManejadorTrabajadores, que se encarga de inicializar a los distintos Recolectores y Productores, que pasaran a ser explicados en el proximo apartado.
Ya por fuera del conocimiento directo del usuario, se encuentran las siguientes clases:
- Recolector
- Productor
- Armero
- Cocinero
- Carpintero
- RecolectorInterno
- ProductorInterno
- ArmeroInterno
- CarpinteroInterno
- CocineroInterno
Primero explicaré el porque de la decisión de generar estas clases que parecerían ser redundantes,
Las clases Recolector y Productor encapsulan los threads para su mas sencilla utilización,los derivados de Productor (Armero, Cocinero y Carpintero) agregan nueva logica, que es la de poder inicializar los threads con los correpondientes ***Interno, que son los que eventualmente realizan el trabajo que uno hubiera esperado en este tipo de clases.
La clase RecolectorInterno, es la que se le pasa a los threads generados en Recolector, para que este llame al operator(), en donde se realiza un desencolar de la ColaBloqueante que se le haya proporcionado, y luego se agrega al inventario el Recurso extraido.
La clase ProductorInterno, es la que se le pasa a los threads generados en los derivados de Productor, pero cada derivado de ProductorInterno en particular, posee una logica un poquito diferente, en estos, se extrae un recurso del inventario, que depende de que ProductorInterno sea el que lo haga, y luego se aumentan la cantidad de puntos de beneficio, también dependiendo de quien lo haga.
A continuación se mostrarán varios diagramas UML, para el mas facil entendimiento del modelo.