Partager via


Fonction EnterCriticalSection (synchapi.h)

Attend la propriété de l’objet de section critique spécifié. La fonction retourne lorsque la propriété du thread appelant est accordée.

Syntaxe

void EnterCriticalSection(
  [in, out] LPCRITICAL_SECTION lpCriticalSection
);

Paramètres

[in, out] lpCriticalSection

Pointeur vers l’objet de section critique.

Valeur renvoyée

Cette fonction ne retourne pas de valeur.

Cette fonction peut déclencher EXCEPTION_POSSIBLE_DEADLOCK, également appelée STATUS_POSSIBLE_DEADLOCK, si une opération d’attente sur la section critique expire. L’intervalle de délai d’expiration est spécifié par la valeur de Registre suivante : HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\CriticalSectionTimeout. Ne gérez pas une exception d’interblocage possible ; à la place, déboguez l’application.

Remarques

Les threads d’un processus unique peuvent utiliser un objet de section critique pour la synchronisation d’exclusion mutuelle. Le processus est chargé d’allouer la mémoire utilisée par un objet de section critique, ce qu’il peut faire en déclarant une variable de type CRITICAL_SECTION. Avant d’utiliser une section critique, un thread du processus doit appeler InitializeCriticalSection ou InitializeCriticalSectionAndSpinCount pour initialiser l’objet.

Pour activer l’accès mutuellement exclusif à une ressource partagée, chaque thread appelle la fonction EnterCriticalSection ou TryEnterCriticalSection pour demander la propriété de la section critique avant d’exécuter une section de code qui accède à la ressource protégée. La différence est que TryEnterCriticalSection retourne immédiatement, qu’il ait obtenu ou non la propriété de la section critique, tandis que EnterCriticalSection se bloque jusqu’à ce que le thread puisse prendre possession de la section critique. Une fois le code protégé exécuté, le thread utilise la fonction LeaveCriticalSection pour renoncer à la propriété, ce qui permet à un autre thread de devenir propriétaire et d’accéder à la ressource protégée. Il n’existe aucune garantie quant à l’ordre dans lequel les threads en attente acquièrent la propriété de la section critique.

Une fois qu’un thread possède la propriété d’une section critique, il peut effectuer des appels supplémentaires à EnterCriticalSection ou TryEnterCriticalSection sans bloquer son exécution. Cela empêche un thread de se bloquer pendant l’attente d’une section critique qu’il possède déjà. Le thread entre dans la section critique chaque fois que EnterCriticalSection et TryEnterCriticalSection réussissent . Un thread doit appeler LeaveCriticalSection une fois pour chaque fois qu’il est entré dans la section critique.

N’importe quel thread du processus peut utiliser la fonction DeleteCriticalSection pour libérer les ressources système qui ont été allouées lors de l’initialisation de l’objet de section critique. Une fois cette fonction appelée, l’objet de section critique ne peut plus être utilisé pour la synchronisation.

Si un thread se termine alors qu’il possède la propriété d’une section critique, l’état de la section critique n’est pas défini.

Si une section critique est supprimée alors qu’elle est toujours détenue, l’état des threads en attente de propriété de la section critique supprimée n’est pas défini.

Pendant la fermeture d’un processus, si un appel à EnterCriticalSection se bloque, il arrête le processus immédiatement. Cela peut empêcher l’appel des destructeurs globaux.

Exemples

Pour obtenir un exemple qui utilise EnterCriticalSection, consultez Utilisation d’objets de section critiques.

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 synchapi.h (inclure Windows.h sur Windows Server 2003, Windows Vista, Windows 7, Windows Server 2008 Windows Server 2008 R2)
Bibliothèque Kernel32.lib
DLL Kernel32.dll

Voir aussi

Objets de section critique

DeleteCriticalSection

InitializeCriticalSection

InitializeCriticalSectionAndSpinCount

LeaveCriticalSection

Fonctions de synchronisation

TryEnterCriticalSection

API Vertdll disponibles dans les enclaves VBS