Documentos de Académico
Documentos de Profesional
Documentos de Cultura
SISTEMAS OPERATIVOS
Y TIEMPO REAL
Bibliografa:
CONTENIDOS
Inconvenientes:
La programacin de aplicaciones se vuelve compleja.
La depuracin del cdigo es compleja, debido a la ejecucin de forma simultnea de varios
hilos a la vez.
Los hilos se controlan a travs de su HANDLE: creacin, espera, finalizacin, etc., es decir, todas
las operaciones que realicemos sobre ellos sern a travs de dicho identificador.
De
esta
forma,
el
hilo
ejecutar
la
funcin
especificada
en
el
parmetro
LPTHREAD_START_ROUTINE StartAddress.
Las funciones ejecutadas por los hilos tendrn las siguientes caractersticas:
Una vez acabemos la ejecucin del hilo debe de ejecutarse la funcin CloseHandle(), para
indicarle al sistema operativo que el hilo ha finalizado y debe ser cerrado. Ejemplo:
#include <stdio.h>
#include <windows.h>
DWORD WINAPI hijo(LPVOID pArg){
printf("Hola!! Soy el hijo\n");
return 0;
}
int main (void){
HANDLE hilo=CreateThread(NULL,0,hijo,NULL,0,NULL);
CloseHandle(hilo);
return 0;
}
Sin embargo, en el ejemplo anterior, puede darse el caso de que no se imprima nada. Por qu?
Porque cuando un proceso acaba, todos sus hilos terminan. El programa principal tambin es un
hilo, por lo que si finaliza antes de que finalice su hilo hijo, ste tambin lo har.
De esta forma, el hilo creador de hilos (el padre o programa principal), esperar hasta que su hilo
hijo finalice. Se dice, en este caso, que el padre est bloqueado hasta que el hijo finalice.
Tambin podemos definir mltiples hilos a la vez utilizando un vector de hilos. Cada una de las
posiciones del vector contendr el HANDLE o identificador del hilo correspondiente.
Existe una instruccin que nos permite esperar hasta un mximo de 64 hilos a la vez, es la funcin
WaitForMultipleObjects(), cuyo prototipo es el siguiente:
DWORD WaitForMultipleObjects(
DWORD nCount,
CONST HANDLE *lpHandles,
BOOL fWaitAll, // espera uno o todos
DWORD dwMilliseconds);
Si queremos esperar a todos los hilos de un vector de hilos, fijaremos el valor de fWaitAll a
TRUE. Si fijamos el valor de dicha variable a FALSE, solamente esperaremos a que finalice uno
de ellos.
10
Podemos modificar el ejemplo previo para, por ejemplo, enviar el nmero de hilo que se le ha sido
asignado a cada uno de ellos. Cmo? Empleando uno de los campos disponibles para ello dentro
de la funcin CreateThread(); concretamente el cuarto parmetro.
11
12
Hasta ahora, la ejecucin de los hilos era asncrona, pues no podamos determinar qu hilo se
estaba ejecutando en cada instante. Con este mecanismo de sincronizacin, que controla la entrada
y salida de la seccin crtica, aseguramos la utilizacin en exclusiva del recurso: la variable
compartida. Nota: El hilo que obtiene el acceso a la seccin crtica debe ser quien la libere.
13
14
Si queremos ejecutar de manera infinita un hilo podramos escribir el siguiente cdigo para ello:
DWORD WINAPI hijo(LPVOID arg){
while(1){
//do something
}
return 0;
}
Sin embargo, cmo podemos finalizar la ejecucin de dicho hilo? En este caso, utilizaremos una
variable global compartida, de forma que, sea el padre de dicho hilo el que realmente controle
cundo debe de finalizar la ejecucin del mismo. Inicializando dicha variable a 1, tendremos el
mismo efecto que con el cdigo anterior. Recordemos que, el padre tambin sigue ejecutndose,
por lo que podremos modificar el valor de variable de control cuando sea necesario.
int control=1;//variable global compartida
DWORD WINAPI hijo(LPVOID arg){
while(control){
//do something
}
return 0;
}
15
Aun cuando se desaconseja el uso de la finalizacin forzosa de un hilo, existe una instruccin que
nos permite forzar dicha finalizacin, su prototipo en el lenguaje de programacin C++ es el
siguiente:
WINAPI TerminateThread(
HANDLE hHandle,
DWORD dwExitCode);
Esta funcin solamente debe ser usada en situaciones especiales, y teniendo en cuenta que la
interrupcin en la ejecucin de un hilo se llevar a cabo en cualquier punto del cdigo de ste. Por
citar algunos ejemplos, los problemas en los que podramos incurrir incluyen:
Si el hilo estaba haciendo uso de llamadas especficas al sistema operativo o a un librera auxiliar (por
ejemplo, para el acceso a un perifrico), las consecuencias pueden ser imprevisibles.
16
TEMA 10:
SISTEMAS OPERATIVOS
Y TIEMPO REAL
Bibliografa: