Partager via


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
0
Le thread s’exécute immédiatement après la création.
CREATE_SUSPENDED
0x00000004
Le thread est créé dans un état suspendu et ne s’exécute pas tant que la fonction ResumeThread est appelée.
STACK_SIZE_PARAM_IS_A_RESERVATION
0x00010000
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 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 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.
Un thread dans un exécutable qui appelle la bibliothèque runtime C (CRT) doit utiliser les fonctions _beginthreadex et _endthreadex pour la gestion des threads plutôt que CreateThread et ExitThread; cela nécessite l’utilisation de la version multithread du CRT. Si un thread créé à l’aide de CreateThread appelle le CRT, le CRT peut arrêter le processus dans des conditions de mémoire faible.

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

Voir aussi

closeHandle

CreateProcess

CreateRemoteThread

ExitProcess

ExitThread

GetExitCodeThread

GetThreadPriority

processus et fonctions de thread

ResumeThread

SECURITY_ATTRIBUTES

setThreadPriority

SuspendThread

ThreadProc

threads