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 lpSecurityDescriptor miembro 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 archivo 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 va a ejecutar el subproceso. Este puntero representa la dirección inicial del subproceso. Para obtener más información sobre la función de subproceso, vea 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.
[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 se produce un error en la función, 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 finaliza el subproceso. La terminació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.
Observaciones
El número de subprocesos que un proceso puede crear está limitado por la memoria virtual disponible. De forma predeterminada, cada subproceso tiene un megabyte de espacio de pila. Por lo tanto, no puede crear 2048 o más subprocesos 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 compila 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 está creando el subproceso. Cuando un autor de la llamada intenta acceder al subproceso con la función OpenThread, el token efectivo del autor de la llamada se evalúa en este descriptor de seguridad para conceder o denegar el acceso.
El subproceso recién creado tiene derechos de acceso completos al llamar a la función getCurrentThread de
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 creado 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í mismos 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 se devuelva CreateThread 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
El subproceso se crea con una prioridad de subproceso de THREAD_PRIORITY_NORMAL. Use las funciones
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.
El ExitProcess, ExitThread, CreateThread, funciones createRemoteThread y un proceso que se inicia (como resultado de una llamada por CreateProcess) se serializan 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 de DLL o desasociar a la vez.
- ExitProcess no se completa hasta que no haya ningún subproceso en su inicialización de DLL ni desasocie rutinas.
Windows Phone 8.1: Esta función es compatible con las aplicaciones de la Tienda de Windows Phone 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 Creación de subprocesos.
Requisitos
Requisito | Valor |
---|---|
cliente mínimo admitido | Windows XP [aplicaciones de escritorio | Aplicaciones para UWP] |
servidor mínimo admitido | Windows Server 2003 [aplicaciones de escritorio | Aplicaciones para UWP] |
de la plataforma de destino de |
Windows |
encabezado de |
processthreadsapi.h (incluya Windows.h en Windows Server 2003, Windows Vista, Windows 7, Windows Server 2008 Windows Server 2008 R2) |
biblioteca de |
Kernel32.lib; WindowsPhoneCore.lib en Windows Phone 8.1 |
DLL de |
Kernel32.dll; KernelBase.dll en Windows Phone 8.1 |
Consulte también
funciones de proceso y subproceso de
subprocesos de