4 - Procesos 2 - Threads
4 - Procesos 2 - Threads
4 - Procesos 2 - Threads
MS-DOS Java,
Monopro-
cesadores
Un hilo por proceso Múltiples hilos por proceso
Un proceso Un proceso
Espacio de
Hilo
Direcciones
Categorías en la implementación de hilos 1/3 (Stallings 165)
(Tanenbaum2.2.4)
(Tanenbaum2.2.6)
Puede aproximaciones combinadas de ULT y KLT, por ejemplo algunas distribuciones de
Linux como Ubuntu y Fedora y derivados de UNIX como Solaris.
En un método combinado
• Creación, sincronización y planificación de hilos de una aplicación en modo usuario.
• Planificación de múltiples hilos de un proceso en múltiples procesadores.
• El bloqueo de un hilo no supone (necesariamente) bloquear todo el proceso. y las llamadas
al sistema bloqueantes no necesitan bloquear todo el proceso.
Categorías en la implementación de hilos 3/3
Resumiendo se puede ver gráficamente:
#include <pthread.h>
En las opciones de compilación se deberá agregar:
-lpthread
Manejo de Hilos en C (POSIX)
En un proceso POSIX convencional:
• Existe un hilo inicial que ejecuta la función main()
• Este hilo puede crear más hilos para ejecutar otras funciones dentro del espacio de
direcciones del proceso.
• Todos los hilos de un proceso se encuentran al mismo nivel. (Esto significa que son
“hermanos”, a diferencia de los proceso cuya relación es “padre-hijo”)
• Se dice que un hilo es dinámico si se puede crear en cualquier instante durante la
ejecución de un programa
• Los hilos de un proceso comparten las variables y recursos globales (archivos,
manejadores de señales, etc.) del proceso. Además, cada uno tiene una copia privada de
sus parámetros iniciales y de las variables locales de la función que ejecuta (almacenados
en su pila particular).
Descripción
Esta función suspende la ejecución del hilo que la invoca hasta que el hilo identificado por el
valor tid finaliza, bien por la invocación a la función pthread_exit o por estar cancelado.
Si status no es NULL, el valor devuelto por el hilo (el argumento de la función
pthread_exit, cuando el hilo hijo finaliza) se almacena en la dirección indicada por
status.
El valor devuelto es o bien el argumento de la función pthread_exit o el valor
PTHREAD_CANCELED si el hilo tid está cancelado (o el valor en el return de la función)
El hilo por el que se espera su terminación debe estar en estado sincronizable (joinable state)
• Cuando un hilo en este estado termina, no se liberan sus propios recursos (descriptor
del hilo y pila) hasta que otro hilo espere por él
• La espera por la terminación de un hilo para el cual ya hay otro hilo esperando, genera
un error
Cancelación de hilos
Sintaxis:
int pthread_cancel(pthread_t tid);
Descripción
• La cancelación es el mecanismo por el cual un hilo puede solicitar la terminación de la
ejecución de otro
• Dependiendo de la configuración del hilo al que se solicita su cancelación, puede aceptar
peticiones de cancelación (PTHREAD_CANCEL_ENABLE, estado por defecto) o
rechazarlas (PTHREAD_CANCEL_DISABLE)
Ej. cambio atributo: pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
• En caso de aceptar peticiones de cancelación, un hilo puede completar la cancelación de
dos formas diferentes:
• De forma asíncrona (PTHREAD_CANCEL_ASYNCHRONOUS),: Se cancela
inmediatamente o
• De forma diferida (PTHREAD_CANCEL_DEFERRED, valor por defecto) hasta que
se alcance un punto de cancelación.
• Un punto de cancelación (cancelation point) es un punto en el flujo de control de
un hilo en el que se comprueba si hay solicitudes de cancelación pendientes.
• Cuando un hilo acepta una petición de cancelación, el hilo actúa como si se hubiese
realizado la siguiente invocación pthread_exit(PTHREAD_CANCELED)
Identificación de hilos
A veces es necesario obtener que thread está ejecutando cierta parte de un código.
Sintaxis:
pthread_t pthread_self(void);
int pthread_equal(pthread_t tid1, pthread_t tid2);
Descripción
• La función pthread_self devuelve el identificador de hilo (tid, thread identifier) del hilo
que la invoca
• Para comparar diferentes identificadores de hilo debe utilizarse la función
pthread_equal que:
• Devuelve 0 si los identificares no son iguales
• Otro valor si los identificadores sí son iguales)
Con estas funciones se puede por ejemplo controlar de antemano la posibilidad de hacer un
pthread_join sobre uno mismo.
Ejemplo 1
Ejemplo 2
Ejemplo 3
Ejemplo 4
Ejemplo 5