Laden...

Threads, (dead-)locking, Monitore

Erstellt von Kurt vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.193 Views
K
Kurt Themenstarter:in
11 Beiträge seit 2006
vor 15 Jahren
Threads, (dead-)locking, Monitore

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

3.971 Beiträge seit 2006
vor 15 Jahren

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...

K
Kurt Themenstarter:in
11 Beiträge seit 2006
vor 15 Jahren

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

49.485 Beiträge seit 2005
vor 15 Jahren

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

3.971 Beiträge seit 2006
vor 15 Jahren

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...

W
872 Beiträge seit 2005
vor 15 Jahren

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 😉

K
Kurt Themenstarter:in
11 Beiträge seit 2006
vor 15 Jahren

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