Fonction InitializeCriticalSectionAndSpinCount (synchapi.h)

Initialise un objet de section critique et définit le nombre de spins pour la section critique. Lorsqu’un thread tente d’acquérir une section critique verrouillée, le thread tourne : il entre dans une boucle qui itère le nombre de tours, en vérifiant si le verrou est libéré. Si le verrou n’est pas libéré avant la fin de la boucle, le thread est mis en veille pour attendre que le verrou soit libéré.

Syntaxe

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

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 à processeur unique, 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 temps 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.

Valeur retournée

Cette fonction réussit toujours et retourne une valeur différente de zéro.

Windows Server 2003 et Windows XP : Si la fonction réussit, la valeur de retour est différente de zéro. Si la fonction échoue, la valeur de retour est zéro 0. Pour obtenir des informations détaillées sur l’erreur, appelez GetLastError. À compter de Windows Vista, la fonction InitializeCriticalSectionAndSpinCount réussit toujours, même dans les situations de mémoire insuffisante.

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. Toutefois, le système est équitable pour tous les threads.

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 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 différents processus, 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 étant logiquement opaque. Utilisez uniquement les fonctions de section critique pour gérer les objets de section critiques. Lorsque 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. Prenons l’exemple d’un scénario du pire, 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 des cas, la contention de la section critique est constante, et chaque thread effectue un appel gourmand en traitement à la fonction WaitForSingleObject . Toutefois, si le nombre de spins est correctement défini, 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 si elle est libérée 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. Par exemple, le gestionnaire de tas utilise un nombre de spins d’environ 4 000 pour ses sections critiques par tas.

Pour compiler une application qui utilise cette fonction, définissez _WIN32_WINNT en tant que 0x0403 ou version ultérieure. Pour plus d’informations, consultez Utilisation des en-têtes Windows.

Exemples

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

Configuration requise

   
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

InitializeCriticalSectionEx

SetCriticalSectionSpinCount

Fonctions de synchronisation

WaitForSingleObject

API Vertdll disponibles dans les enclaves VBS