Public feed
#723698
Hicimos uso de programación defensiva con asserts.
Inicializamos todas las variables y tambien las estructuras (con el uso de memset de <string.h>).
Modularizamos en funciones para hacer el codigo mas legible y entendible.
Mantuvimos un codigo coeherente en idioma ingles. Utilizamos el mismo formato sin superar 80 columnas (exepto 1 renglon con 81).
Se hicieron funciones especiales para debuguear el codigo.
Puntos de sincronización y secciones criticas del task_queue
Se utilizaron dos semaforos y un mutex como en un tipico caso productor consumidor. Los mismos inicializan al crear la cola de tareas.
las secciones criticas y puntos de sincronización se encuentran en las funciones task_queue_push y task_queue_pop, porque son las unicas que modifican la cola mientras que se utiliza y deben estar sicronizadas es decir se debe asegurar que solo hay un thread/proceso que esta modificando la seccion critica. Además con los semáforos se hace esperar al consumidor (task_queue_pop) por tareas y productor (task_queue_push) por espacio para poner tareas.
task_queue_t
task_queue_push (task_queue_t q, task_t t)
{
int status = -1;
assert (q);
- Usa el semaforo para esperar por espacio en la cola, y para aclarar que esta usando un espacio mas
status = sem_wait (&q->empty);_;
assert (status == 0);
status = pthread_mutex_lock (&q->mutex);_;
- inicio sección critica
assert (status == 0);
q->buffer[q->front] = t;_;
q->front = (q->front + 1) % q->size;_;
q->count++;_;
- fin de sección critica
status = pthread_mutex_unlock (&q->mutex);_;
assert (status == 0);
- Usa el semaforo para avisar que hay una tarea mas en la cola
status = sem_post (&q->full);_;
assert (status == 0);
return q;
}
task_queue_t
task_queue_pop (task_queue_t q, task_t *t)
{
int status = -1;
assert (q);
- Usa el semaforo para esperar por tareas en la cola, y para aclarar que esta sacando una tarea de la cola
status = sem_wait (&q->full);_;
assert (status == 0);
status = pthread_mutex_lock (&q->mutex);_;
- inicio sección critica
assert (status == 0);
*t = q->buffer[q->rear];_;
q->rear = (q->rear + 1) % q->size;_;
q->count--;_;
- fin de sección critica
status = pthread_mutex_unlock (&q->mutex);_;
assert (status == 0);
- Usa el semaforo para avisar que hay un espacio mas en la cola
status = sem_post (&q->empty);_;
assert (status == 0);
return q;
}
Puntos de sincronización y secciones criticas del thread_pool
Al ser la cola sincronizada, no existen secciones criticas puesto que estan contempladas en el task_queue. Posee un punto de sincronización que es al destruir, se penso en utilizar un semaforo pero al final se decidio una varible booleana (bool terminate) y crear tareas nulas para finalizar los threads y luego destruir el thread_pool.