Ich möchte Neulingen das Einfädeln von Deadlocks erklären. Ich habe in der Vergangenheit viele Beispiele für Deadlocks gesehen, einige mit Code und einige mit Abbildungen (wie die berühmten 4 Autos ). Es gibt auch klassische, leicht festgefahrene Probleme wie The Dining Philosophers , aber diese können zu komplex sein, als dass ein echter Neuling sie vollständig erfassen könnte.
Ich suche nach dem einfachsten Codebeispiel, um zu veranschaulichen, was Deadlocks sind. Das Beispiel sollte:
- Beziehen Sie sich auf ein "echtes" Programmierszenario, das Sinn macht
- Sei sehr kurz, einfach und unkompliziert
Was empfehlen Sie?
multithreading
language-agnostic
deadlock
Roee Adler
quelle
quelle
Antworten:
Vielleicht eine einfache Banksituation.
Sollten zwei Threads gleichzeitig versuchen, die Übertragung ( a, b ) und die Übertragung ( b, a ) gleichzeitig auszuführen , tritt ein Deadlock auf, da sie versuchen, die Ressourcen in umgekehrter Reihenfolge abzurufen.
Dieser Code eignet sich auch hervorragend, um nach Lösungen für den Deadlock zu suchen. Hoffe das hilft!
quelle
sync
kann so etwas sein wie :sync(Account & a) { a.mutex.lock(); }
.Lassen Sie die Natur Deadlock erklären,
Deadlock: Frosch gegen Schlange
quelle
Hier ist ein Codebeispiel aus der Informatikabteilung einer Universität in Taiwan, das ein einfaches Java-Beispiel mit Ressourcensperrung zeigt. Das ist sehr "real" für mich relevant. Code unten:
quelle
Wenn sowohl method1 () als auch method2 () von zwei oder vielen Threads aufgerufen werden, besteht eine gute Wahrscheinlichkeit eines Deadlocks, da Thread 1 beim Ausführen von method1 () und Thread 2 beim Ausführen von method2 die Sperre für das Integer-Objekt erhält () Beide warten darauf, dass sie die Sperre für Integer und String aufheben, um fortzufahren, was niemals passieren wird.
quelle
Eines der einfachen Deadlock-Beispiele, auf die ich gestoßen bin.
quelle
private int index
macht das dort?Hier ist ein einfaches Beispiel in C ++ 11.
quelle
Bitte sehen Sie meine Antwort auf diese Frage . Fazit: Wenn zwei Threads zwei verschiedene Ressourcen erwerben müssen und dies in unterschiedlicher Reihenfolge, können Deadlocks auftreten.
quelle
Ein Beispiel, an das ich denken kann, ist das Szenario mit Tisch, Taschenlampe und Batterien. Stellen Sie sich eine Taschenlampe und ein Paar Batterien auf einem Tisch vor. Wenn Sie zu diesem Tisch gehen und die Batterien greifen, während eine andere Person die Taschenlampe hat, werden Sie beide gezwungen sein, sich unbeholfen anzustarren, während Sie darauf warten, wer ihren Gegenstand zuerst wieder auf den Tisch legt. Dies ist ein Beispiel für einen Deadlock. Sie und die Person warten auf Ressourcen, aber keiner von Ihnen gibt ihre Ressourcen auf.
In ähnlicher Weise tritt in einem Programm ein Deadlock auf, wenn zwei oder mehr Threads (Sie und die andere Person) darauf warten, dass zwei oder mehr Sperren (Taschenlampe und Batterien) freigegeben werden, und die Umstände im Programm so sind, dass die Sperren niemals freigegeben werden ( Sie haben beide ein Puzzleteil).
Wenn Sie Java kennen, können Sie dieses Problem folgendermaßen darstellen:
Wenn Sie dieses Beispiel ausführen, werden Sie feststellen, dass die Dinge manchmal gut und korrekt funktionieren. Aber manchmal druckt Ihr Programm einfach nichts. Das liegt daran, dass eine Person die Batterien hat, während eine andere Person die Taschenlampe hat, die verhindert, dass sie die Taschenlampe einschaltet, was zu einem Deadlock führt.
Dieses Beispiel ähnelt dem Beispiel in den Java-Tutorials: http://docs.oracle.com/javase/tutorial/essential/concurrency/deadlock.html
Ein weiteres Beispiel ist das Schleifenbeispiel:
Dieses Beispiel kann entweder immer wieder "Nicht erledigt" drucken oder es kann niemals "Nicht erledigt" drucken. Der erste geschieht, weil der erste Thread die Klassensperre erhält und sie niemals aufhebt, um zu verhindern, dass der zweite Thread auf 'stopLoop' zugreift. Und das Neueste passiert, weil der zweite Thread vor dem ersten Thread gestartet wurde und die Variable 'done' wahr ist, bevor der erste Thread ausgeführt wird.
quelle
quelle
Ich betrachte das Problem der Dining Philosophen jedoch als eines der einfacheren Beispiele für das Anzeigen von Deadlocks, da die 4 Deadlock-Anforderungen durch die Zeichnung leicht veranschaulicht werden können (insbesondere das kreisförmige Warten).
Ich halte Beispiele aus der realen Welt für viel verwirrender für den Neuling, obwohl ich mir momentan kein gutes Szenario aus der realen Welt vorstellen kann (ich bin relativ unerfahren mit der Parallelität in der realen Welt).
quelle
Ich habe kürzlich festgestellt, dass die Kämpfe zwischen Paaren nichts anderes als ein Stillstand sind. Normalerweise muss einer der Prozesse abstürzen, um ihn zu lösen. Natürlich hat er weniger Priorität (Boy;)).
Hier ist die Analogie ...
Prozess1: Mädchen (G) Prozess2: Junge (B)
Ressource1: Entschuldigung Ressource2: Akzeptieren des eigenen Fehlers
Notwendige Bedingungen:
1. Gegenseitiger Ausschluss: Nur einer von G oder B kann sich gleichzeitig entschuldigen oder einen eigenen Fehler akzeptieren.
2. Halten und warten: Zu einer Zeit hält einer "Sorry" und "Andere". Akzeptieren eines eigenen Fehlers, einer wartet darauf, "Akzeptieren eines eigenen Fehlers", um "Entschuldigung" freizugeben, und der andere wartet auf "Entschuldigung", um das Akzeptieren eines eigenen Fehlers freizugeben.
3. Keine Vorentscheidung: Nicht einmal Gott kann B oder G zwingen, Entschuldigung freizugeben oder eigenen Fehler zu akzeptieren. Und freiwillig? Willst du mich verarschen??
4. Circular Wait: Wieder wartet derjenige, der sich entschuldigt, darauf, dass andere seine eigenen Fehler akzeptieren, und einer, der sich entschuldigt, möchte, dass andere sich zuerst entschuldigen. Es ist also kreisförmig.
Deadlocks treten also auf, wenn alle diese Bedingungen gleichzeitig gelten, und das ist bei einem Zweikampf immer der Fall;)
Quelle: http://www.quora.com/Saurabh-Pandey-3/Posts/Never-ending-couple-fights-a-deadlock
quelle
Ein weiteres einfaches Deadlock-Beispiel mit zwei verschiedenen Ressourcen und zwei Threads, die darauf warten, dass die Ressourcen freigegeben werden. Direkt von examples.oreilly.com/jenut/Deadlock.java
quelle
If all goes as planned, deadlock will occur, and the program will never exit.
Können wir dieses Beispiel zumguarantee
Stillstand bringen?Deadlock kann in einer Situation auftreten , wenn ein
Girl1
zu flirten fehlt mitGuy2
, die von einer anderen gefangen istGirl2
, undGirl2
mit einem an flirt fehlt ,Guy1
die durch gefangen wirdGirl1
. Da beide Mädchen darauf warten, sich gegenseitig zu entleeren, spricht man von einem Deadlock.quelle
Das Problem der Produzenten und Konsumenten zusammen mit dem Problem der Speisephilosophen ist wahrscheinlich so einfach wie es nur geht. Es gibt auch einen Pseudocode, der dies veranschaulicht. Wenn diese für einen Neuling zu komplex sind, sollten sie sich besser bemühen, sie zu erfassen.
quelle
Entscheiden Sie sich für das einfachste Szenario, in dem ein Deadlock auftreten kann, wenn Sie Ihren Schülern das Konzept vorstellen. Dies würde mindestens zwei Threads und mindestens zwei Ressourcen beinhalten (glaube ich). Das Ziel besteht darin, ein Szenario zu entwickeln, in dem der erste Thread eine Sperre für Ressource eins hat und darauf wartet, dass die Sperre für Ressource zwei aufgehoben wird, während Thread zwei gleichzeitig eine Sperre für Ressource zwei hält und darauf wartet die Sperre für Ressource eins, die freigegeben werden soll.
Es spielt keine Rolle, welche Ressourcen zugrunde liegen. Der Einfachheit halber können Sie sie einfach zu einem Dateipaar machen, in das beide Threads schreiben können.
BEARBEITEN: Dies setzt keine andere Kommunikation zwischen Prozessen als die gehaltenen Sperren voraus.
quelle
Ich fand, dass Deadlock IMHO beim Lesen des Problems der Speisephilosophen etwas schwer zu verstehen ist und tatsächlich mit der Ressourcenzuweisung zusammenhängt. Ich möchte ein einfacheres Beispiel nennen, in dem 2 Krankenschwestern um 3 Ausrüstung kämpfen müssen, um eine Aufgabe zu erledigen. Obwohl es in Java geschrieben ist. Eine einfache lock () -Methode wird erstellt, um zu simulieren, wie der Deadlock auftritt, sodass sie auch in anderen Programmiersprachen angewendet werden kann. http://www.justexample.com/wp/example-of-deadlock/
quelle
Einfaches Beispiel von https://docs.oracle.com/javase/tutorial/essential/concurrency/deadlock.html
Ausgabe:
Thread Dump:
quelle
Hier ist ein einfacher Deadlock in Java. Wir brauchen zwei Ressourcen, um einen Deadlock zu demonstrieren. Im folgenden Beispiel ist eine Ressource die Klassensperre (über die Synchronisierungsmethode) und die andere eine Ganzzahl 'i'.
quelle
quelle
Hier ist ein einfacher Deadlock in C #.
Wenn Sie dies eines Tages über den GUI-Thread aufrufen und ein anderer Thread dies ebenfalls aufruft, kann dies zu einem Deadlock führen. Der andere Thread gelangt zu EndInvoke und wartet darauf, dass der GUI-Thread den Delegaten ausführt, während er die Sperre hält. Der GUI-Thread blockiert dieselbe Sperre und wartet darauf, dass der andere Thread sie freigibt. Dies ist jedoch nicht der Fall, da der GUI-Thread niemals verfügbar ist, um den Delegaten auszuführen, auf den der andere Thread wartet. (Natürlich wird die Sperre hier nicht unbedingt benötigt - und vielleicht auch nicht EndInvoke, aber in einem etwas komplexeren Szenario kann der Anrufer aus anderen Gründen eine Sperre erwerben, was zum gleichen Deadlock führt.)
quelle
quelle
quelle
quelle
Ich habe ein ultra Simple Working DeadLock-Beispiel erstellt: -
Im obigen Beispiel führen 2 Threads die synchronisierten Methoden von zwei verschiedenen Objekten aus. Die synchronisierte Methode A wird vom Objekt threadDeadLockA aufgerufen, und die synchronisierte Methode B wird vom Objekt threadDeadLockB aufgerufen. In Methode A wird eine Referenz von threadDeadLockB übergeben, und in Methode B wird eine Referenz von threadDeadLockA übergeben. Jetzt versucht jeder Thread, das andere Objekt zu sperren. In Methode A versucht der Thread, der eine Sperre für threadDeadLockA hält, eine Sperre für das Objekt threadDeadLockB zu erhalten, und in Methode B versucht der Thread, der eine Sperre für threadDeadLockB hält, eine Sperre für threadDeadLockA zu erhalten. Somit warten beide Threads ewig und erzeugen einen Deadlock.
quelle
Lassen Sie mich anhand eines Beispiels mit mehr als 2 Threads klarer erklären .
Angenommen, Sie haben n Threads, die jeweils die Schlösser L1, L2, ..., Ln halten. Angenommen, ab Thread 1 versucht jeder Thread, die Sperre seines Nachbar-Threads zu erlangen. Also wird Thread 1 blockiert, um zu versuchen, L2 zu erhalten (da L2 im Besitz von Thread 2 ist), Thread 2 wird für L3 blockiert und so weiter. Der Thread n wird für L1 blockiert. Dies ist jetzt ein Deadlock, da kein Thread ausgeführt werden kann.
Im obigen Beispiel sehen Sie, dass drei Threads
Runnable
s task1, task2 und task3 enthalten. Vor der Anweisung erhaltensleep(100)
die Threads die Sperren der drei Arbeitsobjekte, wenn sie in diecall()
Methode eintreten (aufgrund des Vorhandenseins vonsynchronized
). Sobald sie jedoch versuchen,callAnother()
das Objekt ihres Nachbar-Threads zu bearbeiten, werden sie blockiert, was zu einem Deadlock führt, da die Sperren dieser Objekte bereits aufgehoben wurden.quelle
quelle
Eine hinterhältige Möglichkeit, mit nur einem Thread einen Deadlock durchzuführen, besteht darin, denselben (nicht rekursiven) Mutex zweimal zu sperren. Dies ist vielleicht nicht das einfache Beispiel, nach dem Sie gesucht haben, aber ich bin auf solche Fälle bereits gestoßen.
quelle
Hier ist mein detailliertes Beispiel für einen Deadlock , nachdem ich viel Zeit verbracht habe. Ich hoffe es hilft :)
quelle