Función CreateThread (processthreadsapi.h)
Crea un subproceso para ejecutarse dentro del espacio de direcciones virtuales del proceso de llamada.
Para crear un subproceso que se ejecute en el espacio de direcciones virtuales de otro proceso, use la función CreateRemoteThread .
Sintaxis
HANDLE CreateThread(
[in, optional] LPSECURITY_ATTRIBUTES lpThreadAttributes,
[in] SIZE_T dwStackSize,
[in] LPTHREAD_START_ROUTINE lpStartAddress,
[in, optional] __drv_aliasesMem LPVOID lpParameter,
[in] DWORD dwCreationFlags,
[out, optional] LPDWORD lpThreadId
);
Parámetros
[in, optional] lpThreadAttributes
Puntero a una estructura de SECURITY_ATTRIBUTES que determina si los procesos secundarios pueden heredar el identificador devuelto. Si lpThreadAttributes es NULL, no se puede heredar el identificador.
El miembro lpSecurityDescriptor de la estructura especifica un descriptor de seguridad para el nuevo subproceso. Si lpThreadAttributes es NULL, el subproceso obtiene un descriptor de seguridad predeterminado. Las ACL del descriptor de seguridad predeterminado para un subproceso proceden del token principal del creador.
[in] dwStackSize
Tamaño inicial de la pila, en bytes. El sistema redondea este valor a la página más cercana. Si este parámetro es cero, el nuevo subproceso usa el tamaño predeterminado para el ejecutable. Para obtener más información, vea Tamaño de pila de subprocesos.
[in] lpStartAddress
Puntero a la función definida por la aplicación que ejecutará el subproceso. Este puntero representa la dirección inicial del subproceso. Para obtener más información sobre la función de subproceso, consulte ThreadProc.
[in, optional] lpParameter
Puntero a una variable que se va a pasar al subproceso.
[in] dwCreationFlags
Marcas que controlan la creación del subproceso.
Valor | Significado |
---|---|
|
El subproceso se ejecuta inmediatamente después de la creación. |
|
El subproceso se crea en un estado suspendido y no se ejecuta hasta que se llama a la función ResumeThread . |
|
El parámetro dwStackSize especifica el tamaño de reserva inicial de la pila. Si no se especifica esta marca, dwStackSize especifica el tamaño de confirmación. |
[out, optional] lpThreadId
Puntero a una variable que recibe el identificador del subproceso. Si este parámetro es NULL, no se devuelve el identificador del subproceso.
Valor devuelto
Si la función se ejecuta correctamente, el valor devuelto es un identificador para el nuevo subproceso.
Si la función no se realiza correctamente, el valor devuelto es NULL. Para obtener información de error extendida, llame a GetLastError.
Tenga en cuenta que CreateThread puede realizarse correctamente incluso si lpStartAddress apunta a datos, código o no es accesible. Si la dirección de inicio no es válida cuando se ejecuta el subproceso, se produce una excepción y el subproceso finaliza. La finalización del subproceso debido a una dirección de inicio no válida se controla como una salida de error para el proceso del subproceso. Este comportamiento es similar a la naturaleza asincrónica de CreateProcess, donde se crea el proceso incluso si hace referencia a bibliotecas de vínculos dinámicos (DLL) no válidas o que faltan.
Comentarios
El número de subprocesos que puede crear un proceso está limitado por la memoria virtual disponible. De forma predeterminada, cada subproceso tiene un megabyte de espacio de pila. Por lo tanto, no se pueden crear 2048 subprocesos o más en un sistema de 32 bits sin /3GB
boot.ini opción. Si reduce el tamaño de pila predeterminado, puede crear más subprocesos. Sin embargo, la aplicación tendrá un mejor rendimiento si crea un subproceso por procesador y genera colas de solicitudes para las que la aplicación mantiene la información de contexto. Un subproceso procesaría todas las solicitudes de una cola antes de procesar las solicitudes en la siguiente cola.
El nuevo identificador de subproceso se crea con el derecho de acceso THREAD_ALL_ACCESS . Si no se proporciona un descriptor de seguridad cuando se crea el subproceso, se crea un descriptor de seguridad predeterminado para el nuevo subproceso mediante el token principal del proceso que crea el subproceso. Cuando un llamador intenta acceder al subproceso con la función OpenThread , el token efectivo del autor de la llamada se evalúa con este descriptor de seguridad para conceder o denegar el acceso.
El subproceso recién creado tiene derechos de acceso completos a sí mismo al llamar a la función GetCurrentThread .
Windows Server 2003: Los derechos de acceso del subproceso se calculan mediante la evaluación del token principal del proceso en el que se creó el subproceso con el descriptor de seguridad predeterminado construido para el subproceso. Si el subproceso se crea en un proceso remoto, se usa el token principal del proceso remoto. Como resultado, el subproceso recién creado puede tener derechos de acceso reducidos a sí mismo al llamar a GetCurrentThread. Es posible que algunos derechos de acceso, como THREAD_SET_THREAD_TOKEN y THREAD_GET_CONTEXT no estén presentes, lo que provoca errores inesperados. Por este motivo, no se recomienda crear un subproceso al suplantar a otro usuario.
Si el subproceso se crea en un estado ejecutable (es decir, si no se usa la marca CREATE_SUSPENDED ), el subproceso puede empezar a ejecutarse antes de que CreateThread devuelva y, en particular, antes de que el autor de la llamada reciba el identificador y el identificador del subproceso creado.
La ejecución del subproceso comienza en la función especificada por el parámetro lpStartAddress . Si devuelve esta función, el valor devuelto DWORD se usa para finalizar el subproceso en una llamada implícita a la función ExitThread . Use la función GetExitCodeThread para obtener el valor devuelto del subproceso.
El subproceso se crea con una prioridad de subproceso de THREAD_PRIORITY_NORMAL. Use las funciones GetThreadPriority y SetThreadPriority para obtener y establecer el valor de prioridad de un subproceso.
Cuando finaliza un subproceso, el objeto de subproceso alcanza un estado señalado, que satisface los subprocesos que estaban esperando en el objeto .
El objeto de subproceso permanece en el sistema hasta que el subproceso ha finalizado y todos los identificadores se han cerrado a través de una llamada a CloseHandle.
Las funciones ExitProcess, ExitThread, CreateThread, CreateRemoteThread y un proceso que se inicia (como resultado de una llamada por CreateProcess) se serializa entre sí dentro de un proceso. Solo se puede producir uno de estos eventos en un espacio de direcciones a la vez. Esto significa que las restricciones siguientes contienen:
- Durante las rutinas de inicio del proceso y de inicialización de DLL, se pueden crear nuevos subprocesos, pero no comienzan la ejecución hasta que se realiza la inicialización de DLL para el proceso.
- Solo un subproceso de un proceso puede estar en una rutina de inicialización o desasociación de DLL a la vez.
- ExitProcess no se completa hasta que no haya subprocesos en su inicialización de DLL ni desasocie rutinas.
Windows Phone 8.1: esta función es compatible con las aplicaciones de Windows Phone Store en Windows Phone 8.1 y versiones posteriores.
Windows 8.1 y Windows Server 2012 R2: esta función es compatible con las aplicaciones de la Tienda Windows en Windows 8.1, Windows Server 2012 R2 y versiones posteriores.
Ejemplos
Para obtener un ejemplo, vea Creating Threads( Creación de subprocesos).
Requisitos
Requisito | Value |
---|---|
Cliente mínimo compatible | Windows XP [aplicaciones de escritorio | aplicaciones para UWP] |
Servidor mínimo compatible | Windows Server 2003 [aplicaciones de escritorio | aplicaciones para UWP] |
Plataforma de destino | Windows |
Encabezado | processthreadsapi.h (incluye Windows.h en Windows Server 2003, Windows Vista, Windows 7, Windows Server 2008 Windows Server 2008 R2) |
Library | Kernel32.lib; WindowsPhoneCore.lib en Windows Phone 8.1 |
Archivo DLL | Kernel32.dll; KernelBase.dll en Windows Phone 8.1 |