Unterschied zwischen racearound-Bedingung und Deadlock
Was ist der Unterschied zwischen einem dead lock und ein Wettlauf um den Zustand in der Programmierung?
InformationsquelleAutor der Frage ckv | 2010-06-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Denke, einer race-condition mit der herkömmlichen Beispiel. Sagen Sie, dass Sie und ein Freund haben eine ATM Karte für das gleiche Konto. Nehmen wir nun an, das Konto über $100. Überlegen Sie, was passiert, wenn Sie versuchen, Rücktritt $10 und Ihr Freund versucht, Sie zurückzuziehen $50 an genau der gleichen Zeit.
Darüber nachdenken, was zu geschehen hat. Die ATM Maschine muss nehmen Sie Ihre Eingaben, Lesen Sie, was derzeit in Ihr Konto ein, und ändern Sie dann die Menge. Beachten Sie, dass in der Programmierung Begriffe, eine abtretungserklärung ist ein multi-Schritt-Prozess.
So, Etikett beiden Transaktionen T1 (Sie zurücktreten $10), und T2 (dein Freund zieht sich zurück $50). Nun, die zahlen unten auf der linken Seite repräsentieren die Zeit, die Schritte.
Nachdem beide Transaktionen abzuschließen, mit dieser timeline, was möglich ist, wenn Sie nicht verwenden, jede Art von Verriegelungsmechanismus, der account hat $50. Dies ist $10 mehr als es sein sollte (Ihrer Transaktion ist für immer verloren, aber Sie haben noch das Geld).
Dies ist eine sogenannte race-condition. Was Sie wollen, ist für die Transaktion serializabledas ist in egal, wie Sie das verschachteln der einzelnen Anweisung Hinrichtungen, das Endergebnis ist genau das gleiche wie einige seriellen schedule (Bedeutung, die Sie ausführen, eine nach der anderen ohne interleaving) von der gleichen Transaktionen. Die Lösung, wieder, ist die Einführung von sperren; jedoch falsche-Verriegelung kann dazu führen, dead lock.
Deadlock tritt auf, wenn es einen Konflikt der eine freigegebene Ressource. Es ist ein bisschen wie ein Catch-22.
Können Sie sehen, dass ein deadlock Auftritt bei mal 7, weil T2 versucht, eine Sperre erwerben, die auf
x
aber T1 hat bereits den lock aufx
aber es ist das warten auf eine Sperre füry
das T2 hält.So schlimm. Sie können diese Diagramme in ein abhängigkeitsdiagramm und Sie werden sehen, dass es einen Zyklus. Das problem hier ist, dass x und y sind Ressourcen, die geändert werden können, zusammen.
Einen Weg, um zu verhindern, dass diese Art von deadlock-problem mit mehrere lock-Objekte (Ressourcen), ist die Einführung einer Bestellung. Sie sehen, im vorherigen Beispiel, T1 gesperrt
x
und danny
aber T2 gesperrty
und dannx
. Wenn beide Transaktionen eingehalten hier einige Bestell-Regel, die sagt, "x
muss stets abgeschlossen sein, bevory
" dann wird dieses problem nicht auftreten. (Sie können ändern, das vorherigen Beispiel mit dieser Regel im Hinterkopf, und sehen keinen deadlock).Diese Beispiele sind trivial und wirklich, ich habe nur die Beispiele, die Sie vielleicht schon gesehen haben, wenn Sie getroffen haben, jede Art von undergrad-Kurs auf diese. In der Realität, der Lösung des deadlock-Probleme können sehr viel schwieriger sein als diese, weil Sie dazu neigen zu haben mehr als ein paar Ressourcen und ein paar Transaktionen interagieren.
Hoffe, das hilft ein wenig. Wie immer, verwenden Wikipedia als Ausgangspunkt für die CS-Konzepte:
http://en.wikipedia.org/wiki/Deadlock
http://en.wikipedia.org/wiki/Race_condition
InformationsquelleAutor der Antwort BobbyShaftoe
Ist ein deadlock, wenn zwei (oder mehr) threads sich gegenseitig blockieren. In der Regel hat dies etwas zu tun mit threads zu versuchen, zu erwerben freigegebenen Ressourcen. Zum Beispiel, wenn threads T1 und T2 erwerben müssen, sowohl die Ressourcen A und B, um Ihre Arbeit tun. Wenn T1 erwirbt die Ressource Ein, dann T2 erwirbt, Ressource, B, T1 konnte dann wartet auf resource B, während die T2 war warten auf Ressource A. In diesem Fall beide threads warten auf unbestimmte Zeit für die Ressource gehalten von dem anderen thread. Diese threads sind angeblich blockiert werden.
Race conditions auftreten, wenn zwei threads aufeinander in eine negatve (buggy), je nach der exakten Reihenfolge, dass Ihre Anweisungen ausgeführt werden. Wenn ein thread definiert eine Globale variable, zum Beispiel, dann einen zweiten thread liest und ändert, dass die Globale variable, und der erste thread die variable liest, den ersten thread möglicherweise einen Fehler, da die variable geändert wurde unerwartet beendet.
InformationsquelleAutor der Antwort TFal
Ich nehme an, du meinst "race conditions" und nicht "race around conditions" (ich habe gehört, der Begriff...)
Grundsätzlich ein dead lock ist ein Zustand, wo Ein thread wartet auf resource X, während eine Sperre auf der Ressource Y, und thread B wartet darauf, für Ressource Y, während eine Sperre auf der Ressource X. Die threads blockieren, aufeinander zu warten, um Ihre sperren freigeben.
Die Lösung für dieses problem ist (in der Regel), um sicherzustellen, dass Sie sperren auf alle Ressourcen in der gleichen Reihenfolge in allen threads. Zum Beispiel, wenn Sie immer sperren Ressource X vor Ressource Y, dann ist mein Beispiel, kann nie führen in eine Sackgasse.
Einer race-condition ist etwas, wo Sie sich darauf verlassen, dass eine bestimmte Sequenz von Ereignissen in einer bestimmten Reihenfolge, aber das kann verhunzt werden, wenn ein anderer thread zur gleichen Zeit ausgeführt. Zum Beispiel, um einen neuen Knoten einfügen in einer verknüpften Liste, müssen Sie zum ändern der Liste Kopf, in der Regel so etwas wie:
Aber wenn zwei threads tun, dass zur gleichen Zeit, dann könnten Sie in einer situation, wo Sie laufen, etwa so:
Wenn das geschieht, dann Thread B änderung der Liste verloren, da Thread A würde überschrieben haben. Es kann noch schlimmer werden, abhängig von der genauen situation, aber das sind die Grundlagen.
Die Lösung für dieses problem ist in der Regel, um sicherzustellen, dass die richtigen locking-Mechanismen (zum Beispiel, nehmen Sie eine Sperre jedes mal, wenn Sie wollen, ändern Sie die verknüpfte Liste, so dass nur ein thread ist, ändern Sie es zu einem Zeitpunkt).
InformationsquelleAutor der Antwort Dean Harding
In der Codierung müssen wir es vermeiden, beide Rennen und deadlock-Bedingung.
InformationsquelleAutor der Antwort cryptonkid