2008-09-24 18 views
3

Je me demande, et j'ai besoin, de stratégies qui peuvent être appliquées pour réduire le verrouillage de bas niveau. Cependant, le problème ici est que ce n'est pas un nouveau code (avec des dizaines de milliers de lignes de code C++) pour une application serveur, donc je ne peux pas simplement réécrire le tout.Techniques pour se débarrasser du verrouillage de bas niveau

Je crains qu'il n'y ait pas de solution à ce problème maintenant (trop tard). Cependant, j'aimerais entendre parler des bons modèles que d'autres ont utilisés.

À l'heure actuelle, il y a trop de verrous et pas autant de conflits, c'est donc un problème de performance matérielle induite par la paranoïa. La meilleure façon de décrire le code est que le code à un seul thread devient soudainement truffé de verrous.

+0

Est-ce que l'unité centrale de traitement a passé le processus d'acquisition et de libération de verrous ou est-ce que le problème est excessif pour certains verrous? –

+0

bas niveau? Comme dans le grain grossier? – svrist

+0

est-ce une application de bureau ou une solution web? pourquoi y a-t-il toutes ces serrures? – Sklivvz

Répondre

4

Pourquoi avez-vous besoin d'éliminer le verrouillage de bas niveau? Avez-vous des problèmes d'interblocage? Avez-vous des problèmes de performance? Ou des problèmes de mise à l'échelle? Les serrures sont-elles généralement contestées ou non?

Quel environnement utilisez-vous? Les réponses en C++ seront différentes de celles de Java, par exemple. Par exemple. Les blocs de synchronisation non sollicités dans Java 6 sont en réalité relativement bon marché en termes de performances, donc la simple mise à niveau de votre JRE peut vous aider à résoudre tout problème que vous essayez de résoudre. Il peut y avoir des améliorations de performances similaires disponibles en C++ en basculant vers un autre compilateur ou bibliothèque de verrouillage.

En général, il existe plusieurs stratégies qui vous permettent de réduire le nombre de mutex que vous acquérez. Tout d'abord, tout ce qui n'est jamais accessible depuis un seul thread n'a pas besoin d'un mutex. Deuxièmement, tout élément immuable est sûr à condition qu'il soit publié en toute sécurité (c'est-à-dire qu'il soit créé de telle sorte qu'un objet partiellement construit ne soit jamais visible par un autre thread). Troisièmement, la plupart des plates-formes prennent désormais en charge les écritures atomiques - ce qui peut aider lorsqu'un seul type primitif (y compris un pointeur) est tout ce qui doit être protégé. Ceux-ci fonctionnent de manière très similaire au verrouillage optimiste dans une base de données. Vous pouvez également utiliser des écritures atomiques pour créer des algorithmes sans verrouillage afin de remplacer des types plus complexes, y compris les implémentations de Map. Cependant, sauf si vous êtes très, très bon, vous feriez mieux d'emprunter l'implémentation déboguée de quelqu'un d'autre (le paquet java.util.concurrent contient beaucoup de bons exemples) - il est notoirement facile d'introduire accidentellement des bugs lors de l'écriture de vos propres algorithmes. Quatrièmement, l'élargissement de la portée du mutex peut aider - soit en maintenant ouvert un mutex plus longtemps, plutôt qu'en le verrouillant et le déverrouillant constamment, ou en prenant un verrou sur un objet plus grand - l'objet plutôt qu'un de ses propriétés, par exemple. Cependant, cela doit être fait extrêmement soigneusement; vous pouvez facilement introduire des problèmes de cette façon.

1

Le modèle de thread de votre programme doit être décidé avant qu'une seule ligne soit écrite. Tout module, s'il n'est pas cohérent avec le reste du programme, peut tomber en panne, corrompre l'interblocage de l'application.

Si vous avez le luxe de repartir à zéro, essayez d'identifier les grandes fonctions de votre programme qui peuvent être effectuées en parallèle et utilisez un pool de threads pour planifier les tâches. L'astuce à l'efficacité est d'éviter les mutex dans la mesure du possible et de (re) coder votre application pour éviter les conflits de ressources à un niveau élevé.

0

Vous trouverez peut-être certaines des réponses here et here utiles lorsque vous recherchez des moyens de mettre à jour de manière atomique un état partagé sans verrous explicites.