Warum geschachtelte locks nicht zu einem deadlock?
Warum funktioniert dieser code nicht zu einem deadlock?
private static readonly object a = new object();
...
lock(a)
{
lock(a)
{
....
}
}
InformationsquelleAutor der Frage Myster | 2011-02-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn ein thread bereits der besitzt eine Sperre, dann kann es "take that lock" erneut, ohne Frage.
Als zu warum das ist, (und warum es eine gute Idee ist), prüfen Sie die folgende situation, wo wir haben eine definierte Sperre Bestellung an anderer Stelle in das Programm der a -> b:
Hoppla, wir gerade gegen unsere Schloss-Bestellung und haben eine potentielle deadlock auf unsere Hände.
Wir wirklich müssen in der Lage sein, Folgendes zu tun:
So, dass unsere lock-Bestellung ist gepflegt, ohne self-Deadlocks, wenn wir rufen
f()
.InformationsquelleAutor der Antwort Anon.
Den
lock
- Schlüsselwort verwendet eine re-entrant-lock, d.h. der aktuelle thread bereits den lock, so dass es nicht versuchen Sie es erneut.Tritt ein deadlock auf, wenn
Thread 1 erwirbt Eine Sperre
Thread 2 erwirbt lock B
Thread 1 versucht, Sperre B (wartet, bis Thread 2 fertig)
Thread 2 versucht, Sperre Ein (wartet, bis Thread 1 fertig)
Beide threads warten nun auf einander und so festgefahren.
InformationsquelleAutor der Antwort Davy8
Vom Abschnitt 8.12 der C# language specification:
Sollte es offensichtlich sein, dass die interne
lock
Umfang ist im gleichen thread wie die äußeren.InformationsquelleAutor der Antwort Dan J