Hallo,
ich bin gerade dabei, in einem Framework (ObjectBuilder von MS) Multithreading-Fähigkeiten einzubauen und zu nutzen, verliere aber leider langsam den Überblick und den Verstand. Mehrere Threads versuchen, den gleichen Monitor zu nutzen und blockieren sich gegenseitig. Mit Debuggen lassen sich die Probleme schwer lokalisieren, denn dabei verzögert sich der Programmfluss so sehr, dass die Deadlocks nicht mehr auftreten.
Kennt ihr eine Möglichkeit, alle aktuell offenen Monitore und die Besitzerthreads der lock-Objekte anzuzeigen, evtl. auch nur für einzelne Threads? Welche Diagnosemöglichkeiten gibt es sonst noch? Habt ihr Literaturtipps zu Multithreading unter .net allgemein?
Danke und viele Grüße,
Kurt
In dem Programm perfmon.exe (Direkt in Windows dabei) kannst du dir bestimmte Leistungsindikatoren anzeigen lassen, u.a. auch .NET CLR-Sperren und Threads
Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...
Danke für den Tipp! Leider komme ich mit dem Tool nicht tief genug rein, ich möchte am besten direkt informiert werden, wenn ein bestimmter Thread ein Objekt sperrt. Leider scheint es da keine Möglichkeit zu geben...
Kurt
Hallo Kurt,
statt des Debuggers kannst du es mit Logging probieren, aber auch das hilft nur begrenzt. Statt das Problem zu suchen, solltest du das Übel an der Wurzel packen:
Du solltest sowenig wie möglich Monitore verwenden, am besten nur einen, dann kann es (quasi) keine Deadlocks geben. Wenn du mehrere Monitore verwenden musst, dann solltest du unbedingt eine Rang- bzw. Reihenfolge festlegen, in der die Monitore betreten werden müssen. Ein Deadlock entsteht z.B. wenn Thread 1 Monitor A betritt und auf Monitor B wartet, während Thread 2 Monitor B betreten hat und auf Monitor A wartet. Wenn beide Threads immer erst A betreten und dann B, tritt kein Deadlock auf.
herbivore
Eventuell hilft dir auch folgende Artikel um Deadlocks zu erkennen: MSDN: Deadlockmonitor
Eventuell helfen dir ergänzend zum Beitrag noch folgende Links: Empfohlene Vorgehensweise für das verwaltete Threading
Going beyond Monitor.Enter/Exit (C# lock) with LockHelper
Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...
Ich wuerde mir mal CHESS ansehen...
CHESS.
Vielleicht hilft das. Ansonsten hilft nur Loggen und anschauen und nochmals anschauen - ich habe aber auch mal einen ganzen Tag einen Deadlock gesucht, der zustande kam, weil ich zwischen zwei locks geloggt habe 😉
Den LockHelper finde ich sehr interessant. Hab heute was ähnliches gebastelt, um nachvollziehen zu können, wer in die Monitore geht und sie verlässt. Ärgerlich ist, dass in Java eine Methode existiert (Thread.holdsLock(obj)), die genau macht, was ich brauche. Und in .net nicht.
Morgen werde ich weitertüfteln. Danke für eure Antworten.
Kurt