7
votes

Comment puis-je trouver la cause de l'impasse dans le programme C # multi-threadé?

Fondamentalement, j'ai un programme de serveur C # (une application de console non dans IIS) qui entre occasionnellement une impasse.

Une chose qui est étrange, c'est quand je fixe le débogueur, je vois 3 threads en attente d'une serrure mais pas de filetage (à l'aide de la fenêtre de threads dans Visual Studio) à l'intérieur du verrou! Qu'est-ce qui se passe ici ... Je suppose que le débogueur Visual Studio est couché.

Mais de toute façon .... Quelles techniques ou outils dois-je utiliser?

merci


1 commentaires

Quel genre de serrure attendent-ils? Que voyez-vous dans les piles d'appels?


5 Réponses :


6
votes

Je démarrerais en envoyant une sortie de trace chaque fois qu'un fil est sur le point d'entrer / laisser une section critique ainsi que chaque fois qu'elle acquiert avec succès une serrure. Utilisez la classe System.Diagnostics.trace code>.

Ensuite, vous devriez pouvoir déterminer à partir de votre sortie de trace que le thread a réellement le verrouillage. P>

code de trace typique: p>

Trace.WriteLine(string.Format("Thread {0} - Acquiring lock - foo",
    Thread.CurrentThread.ManagedThreadId));


0 commentaires

2
votes

Vous pouvez également utiliser WINDBG avec le SOS.DLL pour savoir où réside une impasse. Jetez un coup d'œil à Ce article. La commande sos.dll en question est la suivante: SYNCBLK - Il analyse des threads .NET à la recherche d'informations sur des impuissances potentielles.

Edit: Juste au cas où l'article disparaît hors du Web, voici le lien d'archive Internet ...

https://web.archive.org/web/20170208160911/http://dotnetdebug.net/2006/02/23/Syncblk-in-sos-for-net-Framework-20/


1 commentaires

Notez que, en réalité, il existe plus de scénarios pour des blocages, car les appels intervenus et ainsi de suite peuvent également conduire à des blocages. Mais l'analyse de décharge est toujours un bon départ.



1
votes

Vous avez probablement une condition de course avec vos fils. L'un de vos discussions n'abandonne pas une serrure et il ne l'utilise pas ou permettant à quelqu'un d'autre de l'utiliser. Il arrive également quand un fil a la serrure et est tué avant de l'abandonner. Vous voudrez peut-être consulter l'une des solutions de programmation pour une impasse, telles que le barbier à sommeil, la boulangerie de la Lamport, l'algorithme de Dekker, l'algorithme de Péterson ou les philosophes à manger.


0 commentaires

3
votes

Il y a toujours WINDBG , mais la courbe d'apprentissage peut être un peu intimidant.

Mais voir Brians excellente réponse sur cette question: Détection deadlocks dans une application C #


1 commentaires

@Luhmann - que ce lien est excellent. Très bonne description de l'utilisation de Windbg.



-1
votes

dans un mot, échecs , programme de Microsoft pour aider résoudre exactement ces types de problèmes.

de leur site:

échecs à plusieurs reprises une concurrence test en veillant à ce que chaque course prend un autre entrelacement. Si un L'entrelacement des résultats dans une erreur, Les échecs peuvent reproduire l'entrelacement pour avoir amélioré le débogage. Les échecs sont Disponible pour les personnes gérées et indigènes Programmes.


1 commentaires

Rare quantité d'informations dans le lien que vous avez posté. On dirait que la technologie est longue morte, même des liens sur les codes source sur une page officielle sont morts.