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
0
O thread é executado imediatamente após a criação.
CREATE_SUSPENDED
0x00000004
O thread é criado em um estado suspenso e não é executado até que a função ResumeThread seja chamada.
STACK_SIZE_PARAM_IS_A_RESERVATION
0x00010000
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.
Um thread em um executável que chama a CRT (biblioteca de tempo de execução) C deve usar as funções _beginthreadex e _endthreadex para o gerenciamento de threads em vez de CreateThread e ExitThread; isso requer o uso da versão multithread do CRT. Se um thread criado usando CreateThread chamar o CRT, o CRT poderá encerrar o processo em condições de memória baixa.

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

Confira também

CloseHandle

CreateProcess

CreateRemoteThread

ExitProcess

ExitThread

GetExitCodeThread

Getthreadpriority

Funções de thread e processo

ResumeThread

SECURITY_ATTRIBUTES

SetThreadPriority

SuspendThread

Threadproc

Threads