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.
[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
Il thread viene creato con una priorità thread di THREAD_PRIORITY_NORMAL. Usare le funzioni GetThreadPriority
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.
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
thread