Função CreateThread (processthreadsapi.h)
Cria um thread para ser executado no espaço de endereço virtual do processo de chamada.
Para criar um thread executado no espaço de endereço virtual de outro processo, use a função CreateRemoteThread .
Sintaxe
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
Um ponteiro para uma estrutura SECURITY_ATTRIBUTES que determina se o identificador retornado pode ser herdado por processos filho. Se lpThreadAttributes for NULL, o identificador não poderá ser herdado.
O membro lpSecurityDescriptor da estrutura especifica um descritor de segurança para o novo thread. Se lpThreadAttributes for NULL, o thread receberá um descritor de segurança padrão. As ACLs no descritor de segurança padrão para um thread vêm do token primário do criador.
[in] dwStackSize
O tamanho inicial da pilha, em bytes. O sistema arredonda esse valor para a página mais próxima. Se esse parâmetro for zero, o novo thread usará o tamanho padrão para o executável. Para obter mais informações, consulte Tamanho da pilha de threads.
[in] lpStartAddress
Um ponteiro para a função definida pelo aplicativo a ser executada pelo thread. Esse ponteiro representa o endereço inicial do thread. Para obter mais informações sobre a função thread, consulte ThreadProc.
[in, optional] lpParameter
Um ponteiro para uma variável a ser passada para o thread.
[in] dwCreationFlags
Os sinalizadores que controlam a criação do thread.
Valor | Significado |
---|---|
|
O thread é executado imediatamente após a criação. |
|
O thread é criado em um estado suspenso e não é executado até que a função ResumeThread seja chamada. |
|
O parâmetro dwStackSize especifica o tamanho inicial da reserva da pilha. Se esse sinalizador não for especificado, dwStackSize especificará o tamanho da confirmação. |
[out, optional] lpThreadId
Um ponteiro para uma variável que recebe o identificador de thread. Se esse parâmetro for NULL, o identificador de thread não será retornado.
Retornar valor
Se a função for bem-sucedida, o valor retornado será um identificador para o novo thread.
Se a função falhar, o valor retornado será NULL. Para obter informações de erro estendidas, chame GetLastError.
Observe que CreateThread pode ter êxito mesmo se lpStartAddress apontar para dados, código ou não estiver acessível. Se o endereço inicial for inválido quando o thread for executado, ocorrerá uma exceção e o thread será encerrado. O término do thread devido a um endereço inicial inválido é tratado como uma saída de erro para o processo do thread. Esse comportamento é semelhante à natureza assíncrona de CreateProcess, em que o processo é criado mesmo que se refira a DLLs (bibliotecas de vínculo dinâmico) inválidas ou ausentes.
Comentários
O número de threads que um processo pode criar é limitado pela memória virtual disponível. Por padrão, cada thread tem um megabyte de espaço de pilha. Portanto, você não pode criar 2.048 ou mais threads em um sistema de 32 bits sem /3GB
boot.ini opção. Se você reduzir o tamanho da pilha padrão, poderá criar mais threads. No entanto, seu aplicativo terá melhor desempenho se você criar um thread por processador e criar filas de solicitações para as quais o aplicativo mantém as informações de contexto. Um thread processaria todas as solicitações em uma fila antes de processar solicitações na próxima fila.
O novo identificador de thread é criado com o THREAD_ALL_ACCESS direito de acesso. Se um descritor de segurança não for fornecido quando o thread for criado, um descritor de segurança padrão será construído para o novo thread usando o token primário do processo que está criando o thread. Quando um chamador tenta acessar o thread com a função OpenThread , o token efetivo do chamador é avaliado em relação a esse descritor de segurança para conceder ou negar acesso.
O thread recém-criado tem direitos de acesso completos para si mesmo ao chamar a função GetCurrentThread .
Windows Server 2003: Os direitos de acesso do thread para si mesmo são calculados avaliando o token primário do processo no qual o thread foi criado no descritor de segurança padrão construído para o thread. Se o thread for criado em um processo remoto, o token primário do processo remoto será usado. Como resultado, o thread recém-criado pode ter direitos de acesso reduzidos para si mesmo ao chamar GetCurrentThread. Alguns direitos de acesso, incluindo THREAD_SET_THREAD_TOKEN e THREAD_GET_CONTEXT , podem não estar presentes, levando a falhas inesperadas. Por esse motivo, não é recomendável criar um thread enquanto representa outro usuário.
Se o thread for criado em um estado executável (ou seja, se o sinalizador CREATE_SUSPENDED não for usado), o thread poderá começar a ser executado antes de CreateThread retornar e, em particular, antes que o chamador receba o identificador e o identificador do thread criado.
A execução do thread começa na função especificada pelo parâmetro lpStartAddress . Se essa função retornar, o valor retornado DWORD será usado para encerrar o thread em uma chamada implícita para a função ExitThread . Use a função GetExitCodeThread para obter o valor retornado do thread.
O thread é criado com uma prioridade de thread de THREAD_PRIORITY_NORMAL. Use as funções GetThreadPriority e SetThreadPriority para obter e definir o valor de prioridade de um thread.
Quando um thread termina, o objeto thread atinge um estado sinalizado, satisfazendo todos os threads que estavam esperando no objeto.
O objeto thread permanece no sistema até que o thread seja encerrado e todos os identificadores para ele tenham sido fechados por meio de uma chamada para CloseHandle.
As funções ExitProcess, ExitThread, CreateThread, CreateRemoteThread e um processo que está sendo iniciado (como resultado de uma chamada por CreateProcess) são serializados entre si em um processo. Somente um desses eventos pode acontecer em um espaço de endereço por vez. Isso significa que as seguintes restrições são:
- Durante as rotinas de inicialização e inicialização de DLL do processo, novos threads podem ser criados, mas não iniciam a execução até que a inicialização de DLL seja feita para o processo.
- Somente um thread em um processo pode estar em uma rotina de inicialização ou desanexação de DLL por vez.
- O ExitProcess não é concluído até que não haja threads em suas rotinas de inicialização ou desanexação de DLL.
Windows Phone 8.1: essa função tem suporte para aplicativos da Windows Phone Store no Windows Phone 8.1 e posterior.
Windows 8.1 e Windows Server 2012 R2: essa função tem suporte para aplicativos da Windows Store em Windows 8.1, Windows Server 2012 R2 e posteriores.
Exemplos
Para obter um exemplo, consulte Criando threads.
Requisitos
Requisito | Valor |
---|---|
Cliente mínimo com suporte | Windows XP [aplicativos da área de trabalho | aplicativos UWP] |
Servidor mínimo com suporte | Windows Server 2003 [aplicativos da área de trabalho | Aplicativos UWP] |
Plataforma de Destino | Windows |
Cabeçalho | processthreadsapi.h (inclua Windows.h no Windows Server 2003, Windows Vista, Windows 7, Windows Server 2008 Windows Server 2008 R2) |
Biblioteca | Kernel32.lib; WindowsPhoneCore.lib no Windows Phone 8.1 |
DLL | Kernel32.dll; KernelBase.dll no Windows Phone 8.1 |