Sie sind auf Seite 1von 4

SOBRE MULTITHREADING EN WINDOWS

Cada thread debe tener una funcin de punto de partida donde comienza la ejecucin de este. Esta funcin debe lucir de la siguiente manera:
DWORD WINAPI ThreadFunc(PVOID pvParam){ DWORD dwResult = 0; ... return(dwResult); }

El thread puede hacer la tarea que quiera. Al final, retornara algn valor y en este punto el thread se detiene. Algunas cosas que vale la pena notar: 1. La funcin thread puede tener el nombre que quiera. 2. La funcin thread debe retornar algo, lo cual se convierte en el cdigo de salida del thread. 3. La funcin thread y en general todas las funciones debern intentar usar los para metros de la funcin y las variables locales lo mas que pueda. Ahora hablemos de como hacer que el sistema operativo cree un thread que ejecute la funcin discutida anteriormente.

The CreateThread Function


Si se desea crear uno o ms threads secundarios, simplemente se debe hacer una llamada a la funcin CreateThread
HANDLE CreateThread( PSECURITY_ATTRIBUTES psa, DWORD cbStackSize, PTHREAD_START_ROUTINE pfnStartAddr, PVOID pvParam, DWORD dwCreateFlags, PDWORD pdwThreadID);

Cuando esta funcin es llamada, el sistema crea un objeto thread del kernel. Este objeto no es el thread por si mismo sino una pequea estructura de datos que el sistema operativo usa para manejar el thread. El sistema aloja memoria fuera del espacio de direcciones del proceso para el uso de la pila del thread. El nuevo thread corre en enel mismo contexto que el thread de creacin, por lo tanto a todos los manipuladores de los obejtos de kernel del proceso, toda la memoria en el proceso y a las pilas de todos los otros threads que estn en el mismo proceso. Esto hace realmente simple la comunicacion para multiples threads en un mismo proceso. psa: es un parmetro que apunta a una estructura SECURITY_ATTRIBUTES. Se puede pasar NULL si se quiere los parametros de seguridad usuales. Si se desea que algn proceso hijo sea capaz de heredar un manejador a este thread, se debe especificar un valor distinto para psa. cbStackSize: Especifica cuanto espacio de direcciones puede usar este thread para su propia pila. pfnStartAddr y pvParam: Estos parmetros indican la direccin de la funcin del thread que se desea ejecutar con la creacin del thread y pvParam es el mismo parmetro que se le pasa a la funcin del thread. CreateThread no hace nada ms con este parmetro sino pasrselo a la funcin especificada por pfnStartAddr.

dwCreateFlags: este parametro especifica banderas adicionales que controlan la creacin del thread. Puede tener el valor de cero o CREATE_SUSPENDED. Si el valor es cero, ese ejecutara inmediatamente despus de que es creado. Si el flag es CREATE_SUSPENDED, el thread se crea en un estado supendido y no se ejecutara mientras no se llame la funcin ResumeThread. pdwThreadID: El ultimo parametro de CreateThread, debe ser una direccin valida de tipo DWORD donde CreateThread almacena el ID que el sistema asigna al nuevo thread. Usualmente se pasa como NULL este parametro, lo cual le dice a la funcin CreateThread que no se esta interesado en el ID del thread. Finalizando un thread Un thread puede terminarse de cuatro maneras. A continuacin se describen los cuatro mtodos para terminar un thread y se describe que ocurre cuando termina un thread. a. La funcin asociada al thread termina de ejecutarse (altamente recomendado). Siempre se debera disenhar las funciones de los threads para que terminen (retornen) cuando se desee que el thread termine. Esta es la nica forma de asegurarse que todos los recursos del thread van a ser liberados correctamente. Usar este mtodo garantiza lo siguiente: Todos los objetos de c++ creados en la funcin del thread sern destruidos a travs de sus destructores. El sistema operativo liberara apropiadamente la memoria usada por la pila del thread. El sistema decrementara el contador de uso de los objetos de kernel de thread. b. El thread se mata asi mismo llamando la funcin ExitThread (evitar este metodo). Este mtodo se usa para forzar a terminar el thread. La forma de la funcin es: VOID ExitThread(DWORD dwExitCode); Esta funcin termina el thread y causa que el sistema operativo limpie todos los recursos que fueron usados por el thread. Sin embargo, los recursos de c++ no sern destruidos. El parametro que se le pasa a la funcin es para decirle como establecer el cdigo de salida del thread. c. Un thread en el mismo proceso u otro llama la funcin TerminateThread (evitar este mtodo). La funcin tiene la siguiente forma: BOOL TerminateThread(HANDLE hThread, DWORD dwExitCode); A diferencia de ExitThread, la cual termina el thread llamado, TerminateThread puede terminar cualquier thread. El parametro hThread identifica el manejador del thread a ser terminado. Cuando el thread termina, su cdigo de salida se vuelve el vaor que se paso a la funcin como dwExitCode. Tambien se decrementa el valor del contador de uso de los objetos de kernel de thread. Esta funcin es asncrona, es decir que la funcin le dice al sistema que se desea terminar el thread pero no se garantiza que la accin se ejecute al tiempo que la funcin regresa. Si se necesita saber con seguridad que el thread ha terminado, se debe usar la funcin WaitForSingleObject (o una funcin similar) pasndole el manipulador del thread. Una aplicacin bien disenhada jamas usa esta funcin porque el thread que esta siendo terminado jamas recibe notificacin de que esta muriendo. El thread no puede limpiarse apropiadamente y no puede prevenirse a si mismo de ser terminado.

d. El proceso que contiene el thread termina (evitar este metodo). Las funciones ExitProcess y TeminateProcess tambin terminan threads. La diferencia es que estas funciones matan todos los threads contenidos en los procesos que estn siendo terminados. Tambien, a causa de que en proceso entero esta siendo terminado, todos los recursos en uso por el proceso sern limpiados, lo que incluye a las pilas de los threads. Estas dos funciones causan que los threads restantes en el proceso sean matados a la fuerza, como si se llamara la funcin TerminateThread fuera llamada para cada uno. Obviamente, esto significa que la apropiada destruccin de los objetos de c++ no es llevada a cabo.

CUANDO UN THREAD TERMINA Las siguientes acciones ocurren cuando un thread termina: Todos los objetos manipuladores que pertenecan al thread son liberados. En Windows, la mayora de los objetos son propiedad del proceso que contiene el thread que crea los objetos. Sin embargo, un thread posee dos objetos de usuario: ventanas y ganchos. Cuando un thread muere, el sistema automticamente destruye cualquier ventana y desinstala cualquier gancho haya sido creado o instalado por el thread. Otros procesos son destruidos por nicamente cuando termina el proceso propietario. El cdigo de salida del thread cambia de STILL_ALIVE al cdigo pasado a ExitThread o TerminateThread. Si el thread es el ulimo activo en el proceso, el sistema considera el proceso terminado.

Cuando un thread ha terminado, los otros threads pueden llamar la funcin GetExitCodeThread para chequear si el thread especificado por hThread ha terminado y si ha terminado, determinar su cdigo de salida. BOOL GetExitCodeThread( HANDLE hThread, PDWORD pdwExitCode ); El valor del codigo de salida se retorna en pdwExitCode. Si el thread no ha terminado cuando GetExitCodeThread es llamado, la funcin llena el pdwExitCode con el identificador STILL_ALIVE. Si la funcin es exitosa, retorna TRUE.

PROGRAMACION DE THREADS, PRIORIDADES Y AFINIDADES.

Un sistema operativo preventivo debera usar un algoritmo para saber que threads cuando deben ser programados y por cuanto tiempo. En este aparte, miraremos que algoritmos usa Windows Vista.

Das könnte Ihnen auch gefallen