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 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
0
Le thread s’exécute immédiatement après sa création.
CREATE_SUSPENDED
0x00000004
Le thread est créé dans un état suspendu et ne s’exécute pas tant que la fonction ResumeThread n’est pas 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 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.
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 insuffisante.

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

Voir aussi

CloseHandle

CreateProcess

CreateRemoteThread

ExitProcess

ExitThread

GetExitCodeThread

GetThreadPriority

Fonctions de processus et de thread

ResumeThread

SECURITY_ATTRIBUTES

SetThreadPriority

SuspendThread

ThreadProc

Threads