miércoles, 5 de febrero de 2014

Threads

Antes de empezar me gustaría mencionar que es importante traer de casa una base sólida en C, ya que todos los servicios que utilizaremos de POSIX son llamadas a librerías escritas en C estándar.


Creación de hebras

#include <pthread.h> 
int pthread_create(
   pthread_t *thread, const pthread_attr_t *attr,
   void *(*start_routine) (void*), void *arg
);
 
int pthread_attr_destory(pthread_attr_t *attr); 
int pthread_attr_init(pthread_attr_t *attr);

El número máximo de hebras que se pueden crear dependerá de la implementación. Además no existe una jerarquía o dependencia entre las hebras.

Tenemos que tener en cuenta que en un sistema monoprocesador, o en el que hay más hebras que procesadores, sólo una de entre las hebras ejecutables puede estar ejecutándose, el resto deberá esperar (según la política que implantemos).

Estado ejecutable

Una hebra pasa de "lista" a "ejecución" cuando el procesador queda disponible. Del mismo modo una hebra pasa de "ejecución" a "lista" dependiendo del tipo de planificación que hayamos empleado. El cambio de una hebra por otra en el procesador se denomina "cambio de contexto" y es un proceso con una carga computacional importante.

Estado bloqueado

Una hebra se encuentra en estado "bloqueado" cuando no puede continuar su ejecución hasta que ocurra "algún evento". Este estado es imprescindible para la sincronización de las hebras. Las hebras en POSIX no se pueden bloquear ellas mismas.

Terminación de hebras

void pthread_exit(void *value_ptr);
int pthread_cancel(pthread_t thread);

Una hebra termina cuando lo hace la rutina asociada a ella. Se invoca a la función pthread_exit. Para cancelarla habría que invocar a pthread_cancel.

El proceso termina llamando a exec() o exit(). Mientras que el main() termina sin llamar explícitamente a pthread_exit.


No hay comentarios:

Publicar un comentario