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 membre lpSecurityDescriptor 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 la pile des 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 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 sa création. |
|
Le thread est créé dans un état suspendu et ne s’exécute pas tant que la fonction ResumeThread n’est pas 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 a la valeur NULL, l’identificateur de thread n’est pas retourné.
Valeur retournée
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étaillées sur l’erreur, 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ébut 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 (DLL) non valides ou manquantes.
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 /3GB
boot.ini option. Si vous réduisez la taille de la 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 demandes 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 aucun descripteur de sécurité n’est 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éé dispose de 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 de 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 échecs inattendus. Pour cette raison, la création d’un thread tout en empruntant l’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 le retour de CreateThread 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 retourne, la valeur de retour DWORD est utilisée pour arrêter le thread dans un appel implicite à la fonction ExitThread . Utilisez la fonction GetExitCodeThread pour obtenir la valeur de retour du thread.
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 tous les threads en attente sur l’objet.
L’objet thread reste dans le système jusqu’à ce que le thread soit terminé et que tous les handles qu’il ait été fermés par le biais d’un appel à CloseHandle.
Les fonctions ExitProcess, ExitThread, CreateThread, CreateRemoteThread et un processus qui démarre (à la suite d’un appel de 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 appliquées :
- 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 de la DLL n’est pas terminée pour le processus.
- Un seul thread d’un processus peut se trouver dans une routine d’initialisation ou de détachement de DLL à la fois.
- ExitProcess ne se termine pas tant qu’il n’y a pas de threads dans leurs routines d’initialisation ou de détachement de DLL.
Windows Phone 8.1 : cette fonction est prise en charge pour les applications 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.
Configuration requise
Condition requise | Valeur |
---|---|
Client minimal pris en charge | Windows XP [applications de bureau | applications UWP] |
Serveur minimal pris en charge | Windows Server 2003 [applications de bureau | applications UWP] |
Plateforme cible | Windows |
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 |