Ich hatte eine Diskussion mit einem Teamkollegen über das Sperren in .NET. Er ist ein wirklich kluger Kerl mit einem umfassenden Hintergrund in der Programmierung auf niedrigerer und höherer Ebene, aber seine Erfahrung mit der Programmierung auf niedrigerer Ebene übertrifft meine bei weitem. Wie auch immer, er argumentierte, dass .NET-Sperren auf kritischen Systemen vermieden werden sollten, von denen erwartet wird, dass sie unter hoher Last stehen, wenn dies überhaupt möglich ist, um die zugegebenermaßen geringe Wahrscheinlichkeit zu vermeiden, dass ein "Zombie-Thread" ein System zum Absturz bringt. Ich benutze routinemäßig das Sperren und wusste nicht, was ein "Zombiethread" ist, also fragte ich. Der Eindruck, den ich von seiner Erklärung bekam, ist, dass ein Zombiethread ein Thread ist, der beendet wurde, aber irgendwie immer noch an einigen Ressourcen festhält. Ein Beispiel, das er gab, wie ein Zombie-Thread ein System beschädigen könnte, war, dass ein Thread eine Prozedur beginnt, nachdem er ein Objekt gesperrt hat. und wird dann irgendwann beendet, bevor die Sperre aufgehoben werden kann. Diese Situation kann zum Absturz des Systems führen, da bei Versuchen, diese Methode auszuführen, alle Threads auf den Zugriff auf ein Objekt warten, das niemals zurückgegeben wird, da der Thread, der das gesperrte Objekt verwendet, tot ist.
Ich glaube, ich habe das Wesentliche verstanden, aber wenn ich nicht auf der Basis bin, lassen Sie es mich bitte wissen. Das Konzept ergab für mich einen Sinn. Ich war nicht ganz davon überzeugt, dass dies ein echtes Szenario ist, das in .NET passieren kann. Ich habe noch nie von "Zombies" gehört, aber ich erkenne, dass Programmierer, die auf niedrigeren Ebenen eingehend gearbeitet haben, tendenziell ein tieferes Verständnis der Computergrundlagen (wie Threading) haben. Ich sehe jedoch definitiv den Wert des Sperren, und ich habe viele Weltklasse-Programmierer gesehen, die das Sperren wirksam einsetzen. Ich habe auch nur begrenzte Möglichkeiten, dies für mich selbst zu bewerten, weil ich weiß, dass die lock(obj)
Aussage wirklich nur syntaktischer Zucker ist für:
bool lockWasTaken = false;
var temp = obj;
try { Monitor.Enter(temp, ref lockWasTaken); { body } }
finally { if (lockWasTaken) Monitor.Exit(temp); }
und weil Monitor.Enter
und Monitor.Exit
markiert sind extern
. Es scheint denkbar, dass .NET eine Art von Verarbeitung durchführt, die Threads vor der Exposition gegenüber Systemkomponenten schützt, die diese Auswirkungen haben könnten. Dies ist jedoch rein spekulativ und basiert wahrscheinlich nur auf der Tatsache, dass ich noch nie von "Zombie-Threads" gehört habe. Vor. Ich hoffe also, dass ich hier ein Feedback dazu bekommen kann:
- Gibt es eine klarere Definition eines "Zombiethreads" als das, was ich hier erklärt habe?
- Können Zombiethreads in .NET auftreten? (Warum Warum nicht?)
- Wie kann ich gegebenenfalls die Erstellung eines Zombiethreads in .NET erzwingen?
- Wie kann ich das Sperren nutzen, ohne ein Zombie-Thread-Szenario in .NET zu riskieren?
Aktualisieren
Ich habe diese Frage vor etwas mehr als zwei Jahren gestellt. Heute ist das passiert:
wait
oder waitpid
. Der untergeordnete Prozess wird dann als "Zombie-Prozess" bezeichnet. Siehe auch howtogeek.com/119815