Fonction SetCriticalSectionSpinCount (synchapi.h)
Définit le nombre de spins pour la section critique spécifiée. L’épinglage signifie que lorsqu’un thread tente d’acquérir une section critique verrouillée, le thread entre dans une boucle, vérifie si le verrou est libéré et si le verrou n’est pas libéré, le thread est mis en veille.
Syntaxe
DWORD SetCriticalSectionSpinCount(
[in, out] LPCRITICAL_SECTION lpCriticalSection,
[in] DWORD dwSpinCount
);
Paramètres
[in, 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 zéro (0). Sur les systèmes multiprocesseurs, si la section critique n’est pas disponible, le thread appelant tourne dwSpinCount fois 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
La fonction retourne le nombre de spins précédent pour la section critique.
Remarques
Les threads d’un processus unique peuvent utiliser un objet de section critique pour la synchronisation d’exclusion mutuelle. 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 appeler la fonction InitializeCriticalSection ou InitializeCriticalSectionAndSpinCount pour initialiser l’objet. Vous pouvez ensuite modifier le nombre de spins en appelant la fonction SetCriticalSectionSpinCount .
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.
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.
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 |