Proceso en UNIX | Hilos en un proceso Unix |
Función POSIX |
Descripción (páginas
man, otra,
en Ubuntu podemos cargar el paquete manpages-posix-dev para acceder
a estas páginas) |
pthread_create | crea un hilo (análogo a fork) |
pthread_equal | verifica igualdad de dos identificados de hilos |
pthread_self | retorna ID de propio hilo (análogo a
getpid) |
pthread_exit | termina el hilo sin terminar el
proceso (análogo a exit) |
pthread_join | espera por el término de un hilo (análogo a waitpid) |
pthread_cancel |
Termina otro hilo (análogo a
abort) |
pthread_detach |
Configura liberación de recursos
cuando termina |
pthread_kill |
envía una señal a un hilo |
# include <pthread.h> int pthread_create(pthread_t * restrict tidp, const pthread_attr_t * restrict
attr,
void * ( * start_routine ) (void *), void * restrict arg); |
tidp: salida, puntero a id del hilo attr: entrada, para definir atributos del hilo, null para default start_routine: entrada, función a correr por el hilo arg: entrada, argumento de la función del hilo. La función debe retornar un * void, el cual es interpretado como el estatus de término por pthread_join |
#include <pthread.h> int pthread_equal(pthread_t tid1, pthread_t tid2); Retorna: no cero si es igual, cero
en otro caso
|
Compara dos identificadores de hilos
tid1 y tid2 |
#include <pthread.h> pthread_t pthread_self(void); Retorna: la ID del hilo que la
llamó
|
Para obtener identificador de un
hilo |
#include <pthread.h> void pthread_exit (void * rval_ptr); |
rval_ptr queda disponible para
otros hilos al llamar pthread_join rval_ptr debe existir después del término del hilo. |
int pthread_join(pthread_t
tid, void ** rval_ptr); Explicación del uso de void ** rval_ptr. |
El hilo llamante se bloquea hasta
el término del hilo indicado. Si el hilo en cuestión es cancelado, rval_prt toma el valor PTHREAD_CANCELED Si no estamos interesados en el valor retornado, poner NULL. |
int pthread_cancel(pthread_t
tid); |
Permite a un hilo cancelar otro
hilo del mismo proceso. Retorno 0 es OK, !=0 => error. Equivale a si el hilo, que desamos cancelar, llamara pthread_exit(PTHREAD_CANCELED); sin embargo, un hilo puede ignorar este requerimiento o controlar cómo se cancela. pthread_cancel sólo hace un requerimiento, pero no lo fuerza. |
int pthread_setcacelstate(int state, int * oldstate); | Permite cambiar el estado del hilo
a PTHREAD_CANCEL_ENABLE (default) o PTHREAD_CANCEL_DISABLE, en este estado el hilo ignora llamados a pthread_cancel que le afecten. |
Ejemplos: Recuperando el estatus de
término de hilos: exitstatus.c
No debemos usar variables automáticas (aquellas en stack) como argumento de pthread_exit, ver badexit2.c porque el acceso a éstas se pierde luego del término de la hebra. |
#include <pthread.h> int pthread_detach(pthread_t tid); |
retorna 0 es OK, !=0 => error. al término del hilo con tid, sus recursos serán retornados y llamados a pthread_join arrojan error. |
0.- fork v/s
threads: Comparación entre creación
de procesos y creación
de hilos
1.- Dos
hebras: una incrementa y otra decrementa un mismo valor global, sin
control de acceso exclusivo. Revisar explicación
a lectura del valor retornado en: pthread_join(tid, (void
**)&pStatus);
2.- Ejemplo
de valor retornado por hebra. Suma de enteros usando varias hebras.
3.- callcopymalloc.c
programa que crea un hilo y copia un archivo. Funciones relacionadas copyfilemalloc.c,
copyfile
y otras en restart.c
4.- callcopypass.c
ídem anterior, el parámetro pasado es un arreglo con espacio para el valor
retornado. Función relacionada copyfilepass.c
5.- copymultiple.c
programa que llama copyfilepass en varios hilos para generar múltiples
copias de un archivo.