CreateThread, fonction (processthreadsapi.h)
Crée un thread à exécuter dans l’espace d’adressage virtuel du processus appelant.
Pour créer un thread qui s’exécute dans l’espace d’adressage virtuel d’un autre processus, utilisez la fonction CreateRemoteThread.
Syntaxe
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
);
Paramètres
[in, optional] lpThreadAttributes
Pointeur vers une structure SECURITY_ATTRIBUTES qui détermine si le handle retourné peut être hérité par les processus enfants. Si lpThreadAttributes a la valeur NULL, le handle ne peut pas être hérité.
Le lpSecurityDescriptor membre de la structure spécifie un descripteur de sécurité pour le nouveau thread. Si lpThreadAttributes a la valeur NULL, le thread obtient un descripteur de sécurité par défaut. Les listes de contrôle d’accès dans le descripteur de sécurité par défaut d’un thread proviennent du jeton principal du créateur.
[in] dwStackSize
Taille initiale de la pile, en octets. Le système arrondit cette valeur à la page la plus proche. Si ce paramètre est égal à zéro, le nouveau thread utilise la taille par défaut pour l’exécutable. Pour plus d’informations, consultez taille de pile de threads.
[in] lpStartAddress
Pointeur vers la fonction définie par l’application à exécuter par le thread. Ce pointeur représente l’adresse de départ du thread. Pour plus d’informations sur la fonction de thread, consultez threadProc.
[in, optional] lpParameter
Pointeur vers une variable à passer au thread.
[in] dwCreationFlags
Indicateurs qui contrôlent la création du thread.
Valeur | Signification |
---|---|
|
Le thread s’exécute immédiatement après la création. |
|
Le thread est créé dans un état suspendu et ne s’exécute pas tant que la fonction ResumeThread est appelée. |
|
Le paramètre dwStackSize spécifie la taille de réserve initiale de la pile. Si cet indicateur n’est pas spécifié, dwStackSize spécifie la taille de validation. |
[out, optional] lpThreadId
Pointeur vers une variable qui reçoit l’identificateur de thread. Si ce paramètre est NULL, l’identificateur de thread n’est pas retourné.
Valeur de retour
Si la fonction réussit, la valeur de retour est un handle pour le nouveau thread.
Si la fonction échoue, la valeur de retour est NULL . Pour obtenir des informations d’erreur étendues, appelez GetLastError.
Notez que CreateThread peut réussir même si lpStartAddress pointe vers des données, du code ou n’est pas accessible. Si l’adresse de début n’est pas valide lorsque le thread s’exécute, une exception se produit et le thread se termine. L’arrêt du thread en raison d’une adresse de démarrage non valide est géré comme une sortie d’erreur pour le processus du thread. Ce comportement est similaire à la nature asynchrone de CreateProcess, où le processus est créé même s’il fait référence à des bibliothèques de liens dynamiques non valides ou manquantes (DLL).
Remarques
Le nombre de threads qu’un processus peut créer est limité par la mémoire virtuelle disponible. Par défaut, chaque thread a un mégaoctet d’espace de pile. Par conséquent, vous ne pouvez pas créer 2 048 threads ou plus sur un système 32 bits sans option /3GB
boot.ini. Si vous réduisez la taille de pile par défaut, vous pouvez créer d’autres threads. Toutefois, votre application aura de meilleures performances si vous créez un thread par processeur et générez des files d’attente de demandes pour lesquelles l’application gère les informations de contexte. Un thread traite toutes les requêtes d’une file d’attente avant de traiter les demandes dans la file d’attente suivante.
Le nouveau handle de thread est créé avec le droit d’accès THREAD_ALL_ACCESS. Si un descripteur de sécurité n’est pas fourni lors de la création du thread, un descripteur de sécurité par défaut est construit pour le nouveau thread à l’aide du jeton principal du processus qui crée le thread. Lorsqu’un appelant tente d’accéder au thread avec la fonction OpenThread, le jeton effectif de l’appelant est évalué par rapport à ce descripteur de sécurité pour accorder ou refuser l’accès.
Le thread nouvellement créé a des droits d’accès complets à lui-même lors de l’appel de la fonction GetCurrentThread.
Windows Server 2003 : les droits d’accès du thread lui-même sont calculés en évaluant le jeton principal du processus dans lequel le thread a été créé par rapport au descripteur de sécurité par défaut construit pour le thread. Si le thread est créé dans un processus distant, le jeton principal du processus distant est utilisé. Par conséquent, le thread nouvellement créé peut avoir des droits d’accès réduits à lui-même lors de l’appel GetCurrentThread. Certains droits d’accès, notamment THREAD_SET_THREAD_TOKEN et THREAD_GET_CONTEXT peuvent ne pas être présents, ce qui entraîne des défaillances inattendues. Pour cette raison, la création d’un thread lors de l’emprunt d’identité d’un autre utilisateur n’est pas recommandée.
Si le thread est créé dans un état exécutable (autrement dit, si l’indicateur CREATE_SUSPENDED n’est pas utilisé), le thread peut commencer à s’exécuter avant CreateThread retourne et, en particulier, avant que l’appelant ne reçoive le handle et l’identificateur du thread créé.
L’exécution du thread commence à la fonction spécifiée par le paramètre lpStartAddress. Si cette fonction est retournée, la valeur de retour DWORD
Le thread est créé avec une priorité de thread de THREAD_PRIORITY_NORMAL. Utilisez les fonctions GetThreadPriority et SetThreadPriority pour obtenir et définir la valeur de priorité d’un thread.
Lorsqu’un thread se termine, l’objet thread atteint un état signalé, satisfaisant les threads qui attendaient l’objet.
L’objet thread reste dans le système jusqu’à ce que le thread se termine et que tous les handles qu’il ait été fermés par le biais d’un appel à CloseHandle.
Les ExitProcess, ExitThread, CreateThread, fonctions CreateRemoteThread et un processus qui démarre (à la suite d’un appel par CreateProcess) sont sérialisés entre eux au sein d’un processus. Un seul de ces événements peut se produire dans un espace d’adressage à la fois. Cela signifie que les restrictions suivantes sont en attente :
- Pendant le démarrage du processus et les routines d’initialisation de DLL, de nouveaux threads peuvent être créés, mais ils ne commencent pas l’exécution tant que l’initialisation dll n’est pas terminée pour le processus.
- Un seul thread d’un processus peut se trouver dans une initialisation DLL ou détacher une routine à la fois.
- exitProcess ne se termine pas tant qu’il n’y a pas de threads dans leur initialisation DLL ou de détacher des routines.
Windows Phone 8.1 : Cette fonction est prise en charge pour les applications du Windows Phone Store sur Windows Phone 8.1 et versions ultérieures.
windows 8.1 et Windows Server 2012 R2: cette fonction est prise en charge pour les applications du Windows Store sur Windows 8.1, Windows Server 2012 R2 et versions ultérieures.
Exemples
Pour obtenir un exemple, consultez Création de threads.
Exigences
Exigence | Valeur |
---|---|
client minimum pris en charge | Windows XP [applications de bureau | Applications UWP] |
serveur minimum pris en charge | Windows Server 2003 [applications de bureau | Applications UWP] |
plateforme cible | Windows |
d’en-tête | processthreadsapi.h (inclure Windows.h sur Windows Server 2003, Windows Vista, Windows 7, Windows Server 2008 Windows Server 2008 R2) |
bibliothèque | Kernel32.lib ; WindowsPhoneCore.lib sur Windows Phone 8.1 |
DLL | Kernel32.dll; KernelBase.dll sur Windows Phone 8.1 |