Condividi tramite


Funzione CreateThread (processthreadsapi.h)

Crea un thread da eseguire all'interno dello spazio indirizzi virtuale del processo chiamante.

Per creare un thread eseguito nello spazio indirizzi virtuale di un altro processo, usare la funzione CreateRemoteThread.

Sintassi

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
);

Parametri

[in, optional] lpThreadAttributes

Puntatore a una struttura di SECURITY_ATTRIBUTES che determina se l'handle restituito può essere ereditato dai processi figlio. Se lpThreadAttributes è NULL, l'handle non può essere ereditato.

Il lpSecurityDescriptor membro della struttura specifica un descrittore di sicurezza per il nuovo thread. Se lpThreadAttributes è NULL, il thread ottiene un descrittore di sicurezza predefinito. Gli ACL nel descrittore di sicurezza predefinito per un thread provengono dal token primario dell'autore.

[in] dwStackSize

Dimensioni iniziali dello stack, in byte. Il sistema arrotonda questo valore alla pagina più vicina. Se questo parametro è zero, il nuovo thread usa le dimensioni predefinite per l'eseguibile. Per altre informazioni, vedere thread stack size.

[in] lpStartAddress

Puntatore alla funzione definita dall'applicazione da eseguire dal thread. Questo puntatore rappresenta l'indirizzo iniziale del thread. Per altre informazioni sulla funzione thread, vedere ThreadProc.

[in, optional] lpParameter

Puntatore a una variabile da passare al thread.

[in] dwCreationFlags

Flag che controllano la creazione del thread.

Valore Significato
0
Il thread viene eseguito immediatamente dopo la creazione.
CREATE_SUSPENDED
0x00000004
Il thread viene creato in uno stato sospeso e non viene eseguito finché non viene chiamata la funzione ResumeThread .
STACK_SIZE_PARAM_IS_A_RESERVATION
0x00010000
Il parametro dwStackSize specifica le dimensioni iniziali della riserva dello stack. Se questo flag non viene specificato, dwStackSize specifica le dimensioni del commit.

[out, optional] lpThreadId

Puntatore a una variabile che riceve l'identificatore del thread. Se questo parametro è NULL, l'identificatore del thread non viene restituito.

Valore restituito

Se la funzione ha esito positivo, il valore restituito è un handle per il nuovo thread.

Se la funzione ha esito negativo, il valore restituito è NULL. Per ottenere informazioni estese sull'errore, chiamare GetLastError.

Si noti che CreateThread può avere esito positivo anche se lpStartAddress punta a dati, codice o non è accessibile. Se l'indirizzo iniziale non è valido quando viene eseguito il thread, si verifica un'eccezione e il thread termina. La terminazione del thread a causa di un indirizzo di avvio non valido viene gestita come uscita di errore per il processo del thread. Questo comportamento è simile alla natura asincrona di CreateProcess, in cui viene creato il processo anche se fa riferimento a librerie di collegamento dinamico non valide o mancanti.

Osservazioni

Il numero di thread che un processo può creare è limitato dalla memoria virtuale disponibile. Per impostazione predefinita, ogni thread ha un megabyte di spazio dello stack. Pertanto, non è possibile creare 2.048 o più thread in un sistema a 32 bit senza /3GB boot.ini opzione. Se si riducono le dimensioni predefinite dello stack, è possibile creare più thread. Tuttavia, l'applicazione avrà prestazioni migliori se si crea un thread per processore e si compilano code di richieste per le quali l'applicazione gestisce le informazioni di contesto. Un thread elabora tutte le richieste in una coda prima di elaborare le richieste nella coda successiva.

Il nuovo handle di thread viene creato con il diritto di accesso THREAD_ALL_ACCESS. Se non viene fornito un descrittore di sicurezza quando viene creato il thread, viene costruito un descrittore di sicurezza predefinito per il nuovo thread usando il token primario del processo che sta creando il thread. Quando un chiamante tenta di accedere al thread con la funzione OpenThread, il token effettivo del chiamante viene valutato rispetto a questo descrittore di sicurezza per concedere o negare l'accesso.

Il thread appena creato ha diritti di accesso completi a se stesso quando si chiama la funzione GetCurrentThread.

Windows Server 2003: I diritti di accesso del thread vengono calcolati valutando il token primario del processo in cui è stato creato il thread rispetto al descrittore di sicurezza predefinito costruito per il thread. Se il thread viene creato in un processo remoto, viene usato il token primario del processo remoto. Di conseguenza, il thread appena creato potrebbe avere diritti di accesso ridotti a se stesso quando si chiama GetCurrentThread. Alcuni diritti di accesso, tra cui THREAD_SET_THREAD_TOKEN e THREAD_GET_CONTEXT potrebbero non essere presenti, causando errori imprevisti. Per questo motivo, la creazione di un thread durante la rappresentazione di un altro utente non è consigliata.

Se il thread viene creato in uno stato eseguibile, ovvero se il flag CREATE_SUSPENDED non viene usato, il thread può iniziare l'esecuzione prima di CreateThread restituisce e, in particolare, prima che il chiamante riceva l'handle e l'identificatore del thread creato.

L'esecuzione del thread inizia dalla funzione specificata dal parametro lpStartAddress. Se questa funzione restituisce un risultato, il valore restituito DWORD viene usato per terminare il thread in una chiamata implicita alla funzione ExitThread . Usare la funzione GetExitCodeThread per ottenere il valore restituito del thread.

Il thread viene creato con una priorità thread di THREAD_PRIORITY_NORMAL. Usare le funzioni GetThreadPriority e SetThreadPriority per ottenere e impostare il valore di priorità di un thread.

Quando un thread termina, l'oggetto thread ottiene uno stato segnalato, soddisfacendo tutti i thread in attesa sull'oggetto.

L'oggetto thread rimane nel sistema finché il thread non viene terminato e tutti gli handle a esso sono stati chiusi tramite una chiamata a CloseHandle.

Le ExitProcess, ExitThread, CreateThread, Le funzioni CreateRemoteThread e un processo che viene avviato (come risultato di una chiamata da CreateProcess) vengono serializzati tra loro all'interno di un processo. Solo uno di questi eventi può verificarsi in uno spazio indirizzi alla volta. Ciò significa che le restrizioni seguenti sono previste:

  • Durante le routine di avvio del processo e di inizializzazione dll, è possibile creare nuovi thread, ma non iniziano l'esecuzione fino a quando non viene eseguita l'inizializzazione della DLL per il processo.
  • Un solo thread in un processo può trovarsi in una routine di inizializzazione o scollegamento della DLL alla volta.
  • exitprocess non viene completato fino a quando non sono presenti thread nella routine di inizializzazione o scollegamento della DLL.
Un thread in un eseguibile che chiama la libreria di runtime C (CRT) deve usare le funzioni di _beginthreadex e _endthreadex per la gestione dei thread anziché CreateThread e ExitThread; ciò richiede l'uso della versione multithreading di CRT. Se un thread creato usando CreateThread chiama CRT, il CRT può terminare il processo in condizioni di memoria insufficiente.

Windows Phone 8.1: Questa funzione è supportata per le app di Windows Phone Store in Windows Phone 8.1 e versioni successive.

windows 8.1 e Windows Server 2012 R2: questa funzione è supportata per le app di Windows Store in Windows 8.1, Windows Server 2012 R2 e versioni successive.

Esempi

Per un esempio, vedere Creazione di thread.

Fabbisogno

Requisito Valore
client minimo supportato Windows XP [app desktop | App UWP]
server minimo supportato Windows Server 2003 [app desktop | App UWP]
piattaforma di destinazione Finestre
intestazione processthreadsapi.h (include Windows.h in Windows Server 2003, Windows Vista, Windows 7, Windows Server 2008 Windows Server 2008 R2)
libreria Kernel32.lib; WindowsPhoneCore.lib in Windows Phone 8.1
dll Kernel32.dll; KernelBase.dll in Windows Phone 8.1

Vedere anche

CloseHandle

CreateProcess

CreateRemoteThread

ExitProcess

ExitThread

GetExitCodeThread

GetThreadPriority

processi e funzioni thread

ResumeThread

SECURITY_ATTRIBUTES

SetThreadPriority

SuspendThread

ThreadProc

thread