J'ai le choix entre soit avoir un paquet de mutex ou un seul pour un objet.
Si vous avez de nombreux fils et l'accès à l'objet qui se passe souvent, de multiples verrous permettrait d'augmenter le parallélisme. Le coût de la maintenance, depuis plus de blocage des moyens plus débogage de verrouillage.
Quelle est l'efficacité pour verrouiller un mutex? I. e. combien d'instructions en assembleur sont-elles probables et combien de temps prennent-ils (dans le cas que le mutex est déverrouillé)?
La précision des instructions en assembleur sont le moins de frais généraux d' un mutex - la mémoire/de cohérence de cache garanties sont les principaux généraux. Et moins souvent un verrou est pris en mieux.
Mutex est composé de deux grandes parties (le raccourci): (1) un drapeau indiquant si le mutex est verrouillé ou non et (2) de la file d'attente.
Changement de l'indicateur est à seulement quelques instructions et fait normalement sans appel système. Si le mutex est verrouillé, syscall qui va arriver à ajouter le thread d'appel dans la file d'attente et commencer à l'attente. Le déverrouillage, si la file d'attente est vide, n'est pas cher mais sinon a besoin d'un syscall pour réveiller l'un des processus en attente. (Sur certains systèmes à bas prix rapide/appels sont utilisés pour mettre en œuvre le mutex, ils deviennent lent (normal) système d'appels uniquement en cas de litige.)
Verrouillage déverrouillé mutex est vraiment pas cher. Déverrouillage de mutex w/o contention n'est pas cher.
Combien coûte un mutex coût? Est-ce un problème d'avoir vraiment beaucoup de mutex? Ou puis-je simplement jeter autant de mutex variables dans mon code que j'ai variables int, et il n'a pas vraiment d'importance?
Vous pouvez lancer autant de mutex des variables dans votre code que vous le souhaitez. Vous êtes seulement limité par la quantité de mémoire de l'application peut allouer.
Résumé. De l'espace utilisateur verrouille (et le mutex en particulier) ne sont pas chers et ne soit soumis à aucune limite du système. Mais beaucoup trop de sorts cauchemar à des fins de débogage. Tableau Simple:
- Moins de serrures signifie plus de querelles (lent syscalls, CPU stands) et moindre parallélisme
- Moins de serrures signifie moins de problèmes de débogage multi-threading problèmes.
- Plus de verrous signifie moins de querelles et de plus le parallélisme
- Plus de verrous signifie plus de chances de courir dans les undebugable les blocages.
L'équilibre schéma de verrouillage de l'application doit être trouvé et maintenu, généralement de l'équilibrage de la #2 et la #3.
(*) Le problème avec le moins très souvent verrouillé mutex est que si vous avez trop de verrouillage dans votre application, il provoque beaucoup d'entre CPU/core trafic pour rincer le mutex de la mémoire dans le cache de données des autres Processeurs pour garantir la cohérence de cache. Les vidages de cache sont comme la lumière-poids interruptions et géré par le Cpu de manière transparente, mais ils présentent donc appelé stands (de la recherche pour "décrochage").
Et les stalles sont ce qui rend le code de verrouillage à courir lentement, souvent sans aucune indication apparente pourquoi l'application est lente. (Certains arche de fournir de l'inter-CPU/core traffic stats, d'autres non.)
Pour éviter le problème, les gens en général recours à un grand nombre de verrous à diminuer la probabilité de blocage des querelles, et pour éviter le décrochage. C'est la raison pour laquelle le bas de l'espace utilisateur de verrouillage, n'est pas soumis à des limites du système, il existe.