You are on page 1of 24

HILOS EN LENGUAJES DE PROGRAMACION

HILOS DE EJECUCIN

unhilo de ejecucin,hebraosubprocesoes la unidad de procesamiento ms


pequea que puede ser planificada por un sistema operativo.

Un hilo es simplemente una tarea que puede ser ejecutada al mismo tiempo con
otra tarea.

DIFERENCIAS ENTRE PROCESOS Y HILOS

FUNCIONALIDA DE LOS HILOS

los hilos poseen un estado de ejecucin y pueden sincronizarse entre ellos


para evitar problemas de comparticin de recursos

cada hilo tiene una tarea especfica y determinada

ESTADO DE UN HILO

Listo

Standby.

Ejecucin

Espera

Transicin

Terminado

CAMBIOS DE ESTADOS

Creacin

Bloqueo

Desbloqueo

terminacin

IMPLEMENTACION DE HILOS

Hilos a nivel de usuario.

Hilos a nivel dekernel.

LIBRERIAS COMUNES EN PYTHON

est controlada por el GIL (Global Interpreter Lock)

import threading

class MiThread(threading.Thread):

def __init__(self, num):

threading.Thread.__init__(self)

self.num = num

def run(self):

print "Soy el hilo", self.num

HILOS EN .NET

Threads o Hilos
En .NET, cuando se lanza una aplicacin se crea un proceso y dentro

de este proceso un hilo de ejecucin o thread para el mtodo Main.


Es posible, a la vez que se ejecuta el mtodo Main, que la aplicacin
lance internamente nuevos hilos de ejecucin en los que se ejecute el
cdigo de algn mtodo.
En Windows, aunque slo se disponga de un procesador, se permite
ejecutar varios hilos simultneamente . Lo que se hace es ofrecer un
tiempo determinado de ejecucin (time slice) a cada hilo. Cuando ese
tiempo finaliza, Windows retoma el control y se lo cede a otro thread.
De este modo se ofrece al usuario la ilusin de tener varias
aplicaciones en ejecucin simultneamente y tambin se optimiza el
uso de los recursos. A este modo de organizar la ejecucin de varios
threads se le llama preemptive multitasking (multitarea
preemptiva)

EJEMPLO
Un

servidor Web es una aplicacin que, al ser lanzada y


creado para ella un proceso y un hilo para el mtodo Main,
espera a que llegue una peticin http de un cliente al puerto
que escucha y cuando llega hace dos cosas: Crea un nuevo hilo de ejecucin o thread en el que atiende
la peticin.
Vuelve inmediatamente (en el hilo principal) a escuchar el
puerto para atender nuevas peticiones (mientras se
atiende la peticin en el nuevo hilo).
Cada vez que llegue una nueva peticin se repetir el mismo
proceso, de modo que se crearn nuevos hilos, pudiendo
haber n hilos en ejecucin simultneamente, uno principal y
n-1 atendiendo peticiones http de los clientes.

La clase Thread
Esta clase pertenece al namespace System.Threading.
Para crear un thread slo hay que crear una instancia de esta clase.
Sus mtodos ms importantes son:

start: lanza el thread a ejecucin.


suspend: detiene momentneamente la ejecucin del thread.
resume: activa el thread suspendido, es decir, lo vuelve a poner en ejecucin.
abort: aborta o para de modo inmediato la ejecucin del thread.
join: detiene el thread donde se invoca hasta que el thread para el que se le
invoca termina.

Las propiedades ms interesantes de la clase Thread son:

Name: permite darle un nombre a un thread que lo distinga del resto.


CurrentThread: contiene una referencia al thread que est actualmente en
ejecucin.
Obtiene el subproceso actualmente en ejecucin.

Ejecucin de un thread.
Para que el mtodo start de la clase Thread lance un thread que

ejecute un cdigo real, ha de recibir como parmetro una referencia o


delegate de tipo ThreadStart
ThreadStart es un delegate que se utiliza para referenciar el punto
de entrada de un cdigo que se desea sea el punto de entrada de
un thread.
Su definicin es: public delegate void ThreadStart();
Por ejemplo, supngase que se desea crear una aplicacin desde la
que se lance un thread que referencie una funcin que muestre 10
veces un mensaje en la consola.
La aplicacin lanzar tambin la funcin desde el thread principal de
la aplicacin (Main).

Para poder diferenciar el hilo


secundario y principal

Parada y activacin de un Thread.


Una vez un thread ha sido lanzado puede ser suspendido (suspend), reactivado

(resume) o abortado (abort).


Suspend: suspende la ejecucin de un thread momentneamente. Un thread
suspendido puede ser reactivado llamando a resume. Si no se utilizan bien pueden
causar situaciones de bloqueo no recuperables.
abort: lanza una excepcin ThreadAbortException en el thread. El tratamiento por
defecto para esta excepcin es finalizar la ejecucin del thread.
No obstante si se captura la excepcin, se puede programar el tratamiento que se
desee. Supngase que se desea crear una aplicacin que lance dos funciones (MiFun
y MiFun2) en sendos threads. MiFun muestra nmeros del 1 al 10 y MiFun2 letras de
la a a la z. Se desea tambin que se ejecute primero MiFun pero slo hasta
mostrar los 5 primeros nmeros y quedar suspendida, tras lo cual debe ejecutarse
MiFun2 hasta acabar y luego debe reactivar a MiFun. El cdigo para hacer esto es (se
resaltan en negrita los puntos clave):

Join.

El mtodo Join pertenece a la clase Thread y lo que hace


es detener la ejecucin del thread donde se invoca
hasta que el thread para el que se invoca termina. Por
ejemplo:

La llamada a Join: hace que el hilo principal


detenga su ejecucin hasta que acabe miThread.
El efecto de esta llamada a Join es que la
llamada a MiFun desde el hilo principal no se
ejecute hasta que acabe miThread, con lo que en
la consola se ver primero la salida

Join.

El mtodo Join es realmente un mtodo de sincronizacin y


consiste en que quien lo invoca (en este caso el hilo principal)
ejecuta el mtodo Wait , detenindose, y el thread sobre el que es
invocado ejecuta el mtodo Pulse cuando termina, permitiendo a
quien se detuvo mediante un Wait reanudar su ejecucin.
Qu sucede si el thread para el que se ha llamado a Join no termina
o no llega nunca a llamar a Pulse?.

miThread.Start();
miThread2.Start();
miThread.Join(100);
miThread2.Join(100);
Console.WriteLine("Han
finalizado los threads");

Prioridades.
Cuando

se lanzan varios threads para que se ejecuten


simultneamente, se les asignan las rodajas de tiempo en
funcin del valor que tenga su propiedad Priority.
La propiedad Priority es una propiedad pblica de la clase
Thread.
Realmente
es
una
enumeracin
del
tipo
ThreadPriority, cuyos posibles valores son:

EJEMPLO
Un ejemplo la aplicacin en que se lanza MiFun dos veces, una
en un thread secundario y otra en el principal. A pesar de
lanzar primero el secundario y luego el principal se ejecutaba
primero el principal y despus el secundario (ya que el
principal tiene la prioridad, por defecto, ms alta que el
secundario).
miThread2.Priority = ThreadPriority.AboveNormal;

La sincronizacin de threads
Consiste en asegurar que distintos threads acceden de modo

coordinado a recursos compartidos.


lock. La sentencia lock bloquea el acceso a un bloque de
cdigo, asegurando que slo el thread que lo ha bloqueado
tiene acceso a tal bloque.

System.Threading.Monitor
La clase Monitor implementa el concepto de monitor de sincronizacin.
La sentencia lock equivale a utilizar un Monitor llamando a sus

mtodos Enter (al comienzo del bloque) y Exit (al final del bloque).
Los mtodos ms importantes de la clase monitor son:

Enter: bloquea el bloque de cdigo al que precede.


TryEnter: es similar a Enter pero no bloquea o produce slo un bloqueo Temporal.
Exit: libera el bloque.
Wait: Detiene al thread que lo llama (muy importante, no bloquea el cdigo a
otros threads sino que detiene al thread llamador) dejndolo en espera de que
otro thread le notifique que puede seguir mediante el mtodo Pulse. Tambin
libera el bloqueo que haya hecho ese thread si es que lo hay.

Pulse: notifica a un thread en la cola de espera (Wait) que puede continuar.


PulseAll: realiza la notificacin a todos los threads de la cola de espera.
Monitor.Enter(this)

You might also like