Hicimos uso de programación defensiva con asserts. Inicializamos todas las variables y tambien las estructuras (con el uso de memset de ). 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.