39 votes

Ce sont des raisons communes pour les blocages?

Les blocages sont difficiles à trouver et très mal à l'aise à supprimer.

Comment puis-je trouver des sources d'erreur pour les blocages dans mon code? Il n'existe aucun "blocage des modèles"?

Dans mon cas particulier, il traite avec les bases de données, mais cette question est ouverte pour chaque blocage.

29voto

Mitch Wheat Points 169614

Mise à jour: Ce récent article de MSDN, des Outils Et des Techniques pour Identifier les Problèmes de concurrence, pourrait également être d'intérêt


Stephen Toub dans l'article MSDN moniteur de Blocage membres de l', quatre conditions sont nécessaires pour les blocages se produisent:

  • Un nombre limité d'une ressource particulière. Dans le cas d'un moniteur en C# (ce que vous utilisez lorsque vous employez le verrouillage de mot-clé), ce nombre limité est un, depuis un moniteur est un organisme de placement-verrou d'exclusion (ce qui signifie qu'un seul thread peut être propriétaire d'un moniteur à un moment).

  • La capacité de tenir une ressource et demande un autre. En C#, cela s'apparente à de verrouillage sur un objet, puis de verrouillage sur un autre, avant de les libérer de la première écluse, par exemple:


lock(a)
{
...
    lock(b)
    {
            ...
    }
}
  • Pas de droit de préemption de la capacité. En C#, cela signifie qu'un thread ne peut pas forcer un autre thread pour libérer un verrou.

  • Une circulaire de la condition d'attente. Cela signifie qu'il existe un cycle de fils, chaque de ce qui est en attente de la prochaine libération d'une ressource avant de pouvoir continuer.

Il continue à expliquer que la façon d'éviter les blocages est à éviter (ou à contrecarrer les) condition de quatre.

Joe Duffy décrit plusieurs techniques pour éviter et de détecter les blocages, y compris celui connu sous le nom de verrouillage de la mise à niveau. Dans le verrouillage de nivellement, les verrous sont affectés les valeurs numériques et les threads doivent seulement acquérir des verrous qui ont le plus haut nombre de verrous qu'ils ont déjà acquis. Cela empêche l' possibilité d'un cycle. C'est aussi souvent difficile de bien faire dans un typique des logiciels d'application aujourd'hui, et d'une incapacité à suivre de verrouillage de nivellement sur chaque serrure acquisition invite l'impasse.

14voto

Brian Rasmussen Points 68853

Le classique de la situation de blocage est Un est tenue de verrouillage X et qui veulent acquérir de verrouillage de Y, tandis que B est tenue de verrouillage de Y et qui veulent acquérir de verrouillage de X. Puisque l'un ne peut terminer ce qu'ils essaient de faire les deux sera à la fin de l'attente pour toujours (à moins de délais d'attente sont utilisés).

Dans ce cas, un blocage peut être évité si A et B d'acquérir les verrous dans le même ordre.

8voto

Peter Drier Points 465

Pas de blocage des modèles à ma connaissance (et 12 ans d'écriture fortement multithread applications de négociation).. Mais le TimedLock classe a été d'une grande aide dans la recherche de blocages qui existent dans le code sans une reprise.

http://www.randomtree.org/eric/techblog/archives/2004/10/multithreading_is_hard.html

en gros, (dotnet/c#) vous rechercher/remplacer tous vos "lock(xxx)" les déclarations de "l'utilisation des TimedLock.De verrouillage(xxx)"

Si un blocage est jamais détecté (verrouillage ne peut être obtenu dans le délai spécifié, par défaut à 10 secondes), alors une exception est levée. Ma version locale aussi immédiatement les journaux de la stacktrace. Marcher jusqu'à la stacktrace (de préférence debug avec les numéros de ligne) et vous verrez immédiatement que les serrures ont été détenus au moment de la panne, et dans lequel il a été de tenter de l'obtenir.

Dotnet 1.1, dans une situation de blocage comme décrit, comme par hasard aurait-il tous les threads qui ont été enfermés à jeter l'exception dans le même temps. Donc, si vous voulez obtenir 2+ stacktraces, et toutes les informations nécessaires pour résoudre le problème. (2.0+ ont peut-être changé le modèle de thread en interne assez pour ne pas être cette chance, je ne suis pas sûr)

8voto

Robin Day Points 39440

S'assurer que tous les transactions sur les tables dans le même ordre est la clé pour éviter le plus commun de blocages.

Par exemple:

Une Transaction

UPDATE Table A SET Foo = 'Bar'
UPDATE Table B SET Bar = 'Foo'

L'Opération B

UPDATE Table B SET Bar = 'Foo'
UPDATE Table A SET Foo = 'Bar'

C'est extrêmement susceptible d'entraîner un blocage comme Une Transaction obtient un verrou sur Une Table, l'Opération B obtient un verrou sur la table B, donc aucun d'entre eux d'obtenir un verrou pour leur deuxième commande jusqu'à ce que l'autre a fini.

Toutes les autres formes de blocages sont généralement causées par la forte intensité de l'utilisation de SQL Server et du blocage de l'interne, tandis que les ressources allouées.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X