Fonction InitializeCriticalSectionEx (synchapi.h)

Initialise un objet de section critique avec un nombre de spins et des indicateurs facultatifs.

Syntaxe

BOOL InitializeCriticalSectionEx(
  [out] LPCRITICAL_SECTION lpCriticalSection,
  [in]  DWORD              dwSpinCount,
  [in]  DWORD              Flags
);

Paramètres

[out] lpCriticalSection

Pointeur vers l’objet de section critique.

[in] dwSpinCount

Nombre de spins pour l’objet de section critique. Sur les systèmes monoprocesseurs, le nombre de spins est ignoré et le nombre de spins de section critique est défini sur 0 (zéro). Sur les systèmes multiprocesseurs, si la section critique n’est pas disponible, le thread appelant tourne dwSpinCount avant d’effectuer une opération d’attente sur un sémaphore associé à la section critique. Si la section critique se libère pendant l’opération de spin, le thread appelant évite l’opération d’attente.

[in] Flags

Ce paramètre peut être 0 ou la valeur suivante.

Valeur Signification
CRITICAL_SECTION_NO_DEBUG_INFO La section critique est créée sans informations de débogage.

Valeur retournée

Si la fonction réussit, la valeur de retour est différente de zéro.

Si la fonction échoue, la valeur de retour est égale à zéro (0). Pour obtenir des informations détaillées sur l’erreur, appelez GetLastError.

Remarques

Les threads d’un processus unique peuvent utiliser un objet de section critique pour la synchronisation d’exclusion mutuelle. Il n’existe aucune garantie quant à l’ordre dans lequel les threads obtiennent la propriété de la section critique, mais le système est équitable pour tous les threads.

Le processus est responsable de l’allocation de 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 initialiser l’objet. Vous pouvez ensuite modifier le nombre de spins en appelant la fonction SetCriticalSectionSpinCount .

Une fois qu’un objet de section critique est initialisé, les threads du processus peuvent spécifier l’objet dans la fonction EnterCriticalSection, TryEnterCriticalSection ou LeaveCriticalSection pour fournir un accès mutuellement exclusif à une ressource partagée. Pour une synchronisation similaire entre les threads de processus différents, utilisez un objet mutex.

Un objet de section critique ne peut pas être déplacé ou copié. Le processus ne doit pas non plus modifier l’objet, mais doit le traiter comme logiquement opaque. Utilisez uniquement les fonctions de section critiques pour gérer les objets de section critiques. Une fois que vous avez terminé d’utiliser la section critique, appelez la fonction DeleteCriticalSection .

Un objet de section critique doit être supprimé avant de pouvoir être réinitialisé. L’initialisation d’une section critique déjà initialisée entraîne un comportement non défini.

Le nombre de spins est utile pour les sections critiques de courte durée qui peuvent rencontrer des niveaux élevés de contention. Considérez le pire scénario, dans lequel une application sur un système SMP a deux ou trois threads qui allouent et libèrent constamment de la mémoire du tas. L’application sérialise le tas avec une section critique. Dans le pire scénario, la contention de la section critique est constante et chaque thread effectue un appel intensif à la fonction WaitForSingleObject . Toutefois, si le nombre de spins est défini correctement, le thread appelant n’appelle pas immédiatement WaitForSingleObject en cas de conflit. Au lieu de cela, le thread appelant peut acquérir la propriété de la section critique s’il est libéré pendant l’opération de rotation.

Vous pouvez améliorer considérablement les performances en choisissant un petit nombre de tours pour une section critique de courte durée. Le gestionnaire de tas utilise un nombre de spins d’environ 4 000 pour ses sections critiques par tas. Cela offre d’excellentes performances et une scalabilité dans presque tous les pires scénarios.

Configuration requise

Condition requise Valeur
Client minimal pris en charge Windows Vista [applications de bureau | applications UWP]
Serveur minimal pris en charge Windows Server 2008 [applications de bureau | applications UWP]
Plateforme cible Windows
En-tête synchapi.h (inclure Windows.h sur Windows 7, Windows Server 2008 Windows Server 2008 R2)
Bibliothèque Kernel32.lib
DLL Kernel32.dll

Voir aussi

Objets de section critique

DeleteCriticalSection

API Vertdll disponibles dans les enclaves VBS