Quand est pthread_spin_lock la bonne chose à utiliser (plus de par exemple un pthread mutex)?
Étant donné que pthread_spin_lock est disponible, quand l'utiliser et quand ne pas les utiliser ?
- à-dire comment aurais-je décider de protéger certains de structure de données partagées avec un pthread mutex ou un pthread spinlock ?
Vous devez vous connecter pour publier un commentaire.
La réponse courte est qu'un spinlock peut être mieux quand vous l'intention de tenir le verrou pour un très court laps de temps (par exemple à ne rien faire, mais incrémenter un compteur), et de contention devraient être rares, mais l'opération se produit assez souvent pour être un goulot d'étranglement des performances. Les avantages d'un spinlock sur un mutex sont:
Point 1 sera toujours debout, mais le point 2 et 3 ont quelque peu diminué l'utilité si vous considérez que de bonnes implémentations de mutex sera probablement tourner un certain nombre de fois avant de demander au noyau de l'aide d'attente.
Maintenant, la réponse longue:
Ce que vous devez vous poser avant d'utiliser spinlocks est de savoir si les avantages potentiels l'emportent sur l'un de rares mais très réel inconvénient: ce qui se passe lorsque le thread qui détient le verrou est interrompu par le planificateur avant de pouvoir libérer le verrou. Bien sûr, cela est rare, mais cela peut se produire même si la serrure est seulement tenue à une seule variable-opération d'incrémentation ou autre chose d'aussi trivial. Dans ce cas, toutes les autres threads tentent d'obtenir le verrou va continuer de tourner jusqu'à ce que le fil de l'détient le verrou obtient prévu et a une chance de libérer le verrou. Que cela ne se produise si les fils en essayant d'obtenir le verrou ayant une priorité plus élevée que le thread qui détient le verrou. Que peut-être un cas extrême, mais même sans des priorités différentes dans le jeu, il peut être très longs délais avant que le propriétaire du verrou obtient à nouveau prévues, et le pire de tout, une fois que cette situation commence, il peut rapidement dégénérer autant de threads, tout en espérant en tirer le verrou, commencer à tourner sur elle, ce qui accapare plus de temps processeur, et de retarder davantage la planification de la thread qui pourrait libérer le verrou.
En tant que tel, je serais prudent avec les spinlocks... 🙂
Le spinlock est un "occupé attente" de verrouillage. Son principal avantage est qu'il garde le thread actif et de ne pas provoquer un changement de contexte, donc si vous savez que vous ne serez en attente pour un temps très court (parce que votre critique de l'opération est très rapide), cela peut donner de meilleures performances qu'un mutex. A l'inverse un mutex va provoquer une diminution de la demande sur le système si la section critique prend beaucoup de temps et un changement de contexte est souhaitable.
TL;DR: Ça dépend.
La méthode la plus sûre avec un gain de performances est un hybride des deux: une adaptation mutex.
Lorsque votre système est doté de plusieurs cœurs de tourner pour quelques milliers de cycles pour capturer le meilleur des cas de faible ou pas de conflit, puis de reporter à une pleine mutex à céder à d'autres threads pour longtemps soutenu les verrous.
Les deux POSIX (
PTHREAD_MUTEX_ADAPTIVE_NP
) et Win32 (SetCriticalSectionSpinCount
) ont adaptative mutex, de nombreuses plates-formes n'ont pas POSIX spinlock API.Spinlock n'a d'intérêt que dans les MP contexte. Il est utilisé pour exécuter les pseudo-atomical tâches. Dans le système monoprocesseur le principe est le suivant :
Mais en MP systèmes nous n'avons pas de garanties que les autres de ne pas exécuter un autre thread qui pourrait entrer dans notre section de code. Pour éviter cela, le verrou de rotation a été créé, son but est de reporter les autres cores d'exécution de la prévention de problème de concurrence. La section critique devient :
Si la tâche de verrouillage est omis, lors d'une planification, d'un autre thread pourrait essayer d'entrer en section une boucle à 100% de CPU en attente de la prochaine planification. Si cette tâche est une haute priorité, il va produire un blocage.