CreateThread
Crea un hilo que se ejecutará en el espacio de direcciones del proceso que llama.
Sintaxis
HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, // dirección de los atributos de seguridad del hilo DWORD dwStackSize, // tamaño inicial de la pila del hilo en bytes LPTHREAD_START_ROUTINE lpStartAddress, // dirección de la función del hilo LPVOID lpParameter, // argumento para nuevo hilo DWORD dwCreationFlags, // flags de creación LPDWORD lpThreadId // dirección del identificador del hilo creado );
Parámetros:
lpThreadAttributes: puntero a estructura SECURITY_ATTRIBUTES que especifica los atributos de seguridad para el hilo.
Si lpThreadAttributes es NULL, el hilo se crea con un descriptor de seguridad por defecto, y el manipulador resultante no es heredado.
dwStackSize: especifica el tamaño en bytes de la pila para el nuevo hilo. Si se especifica 0, el tamaño de la pila por defecto es el mismo tamaño que el del hilo primario del proceso. La pila se asigna automáticamente en el espacio de memoria del proceso y es liberado cuando el hilo termina. Nótese que el tamaño de la pila crece, si es necesario.
CreateThread intenta entregar el número de bytes especificado por el parámetro dwStackSize, y falla si ese tamaño excede de la memoria disponible.
lpStartAddress: puntero a función suministrada por la aplicación que se ejecutará por el hilo y que representa la dirección de entrada del hilo. La función aceptará un argumento de 32 bits y devolverá un valor de 32 bits.
lpParameter: especifica un valor de 32 bits como parámetro a pasar al hilo.
dwCreationFlags: especifica flags adicionales que controlan la creación del hilo. Si se especifica el flag CREATE_SUSPENDED, el hilo se crea en un estado suspendido, y no se ejecutará mientras no se llame a la función ResumeThread. Si este valor es cero, el hilo se ejecutará inmediatamente después de su creación.
lpThreadId: puntero a una variable de 32 bits que recibirá el identificador del hilo creado.
Valor de retorno
Si la función tiene éxito, el valor de retorno es un manipulador al nuevo hilo.
Si la función falla, el valor de retorno es NULL. Para obtener mayor información sobre el error, llamar a GetLastError.
Sólo en Windows 95: CreateThread tiene éxito sólo cuando es llamado en el contexto de un programa de 32 bits. Una DLL de A 32 bits no puede crear un hilo adicional cuando esa DLL es llamada por un programa de 16 bits.
Observaciones
El nuevo manipulador de hilo es creado con acceso completo al nuevo hilo. Si no se proporciona un descriptor de seguridad, el manipulador puede ser usado en cualquier otra función que necesite un manipulador de objeto hilo. Cuando se proporciona un descriptor de seguridad, se realiza una comprobación de acceso en todas los usos subsecuentes del manipulador antes de permitir el acceso. Si la comprobación de deniega el acceso, el proceso que lo requirió no podrá usar el manipulador para tener acceso al hilo.
La ejecución del hilo empieza en al función especificada por el parámetro lpStartAddress. Si esta función regresa, el valor de retorno DWORD se usa para finalizar el hilo en la llamada implícita a la función ExitThread. Usar la función GetExitCodeThread para obtener el valor de retorno del hilo.
La función CreateThread tendrá éxito aunque lpStartAddress apunte a datos, código o no esté accesible. Si la dirección de inicio es inválida cuando el hilo se ejecute, ocurrirá una excepción, y el hilo terminará. La finalización del hilo debido a una dirección de comienzo no válida se manipulará como una salida de error para el proceso del hilo. Este comportamiento es similar al carácter asíncrono de CreateProcess, cuando el proceso es creado aún si se refiere a una biblioteca dinámica (DLL) inválida o perdida.
El hilo es creado con la prioridad THREAD_PRIORITY_NORMAL. Usar las funciones GetThreadPriority y SetThreadPriority para obtener y modificar el valor de la prioridad del hilo.
Cuando un hilo termina, el objeto hilo alcanza un estado "señalado", que satisface a cualquier hilo que esté esperando ese objeto.
El objeto hilo permanece en el sistema hasta que el hilo haya terminado y todos los manipuladores a él hayan sido cerrados a través de una llamada a la función CloseHandle.
Las funciones ExitProcess, ExitThread, CreateThread, CreateRemoteThread, y un proceso que haya empezado (como el resultado de una llamada a CreateProcess) son serializados entre cada otro proceso en su interior. Sólo uno de estos eventos puede suceder en un espacio de direcciones a la vez. Esto significa que existen las siguientes restricciones:
- Durante el proceso de arranque y rutinas de inicialización de DLL, pueden ser creados nuevos hilos, pero no pueden comenzar su ejecución hasta que la inicialización de la DLL esté terminada para el proceso.
- Sólo un hilo en cada proceso puede estar en una inicialización de una DLL o en una rutina separada a la vez.
- ExitProcess no regresará hasta que no haya hilos en sus inicializaciones de DLL o rutinas separadas.
Un hilo que use funciones de una biblioteca run-time C debe usar las funciones beginthread y endthread de run-time C para manejar hilos en lugar de CreateThread y ExitThread. El no hacer esto puede producir pequeñas pérdidas de memoria cuando se llame a ExitThread.