Public feed #723698

Someone

public text v1 · immutable
Raw Edit
·published 2007-10-02 23:47 UTC
rendered paste body
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.