Junior
Was ist eine Deadlock?
sobes.tech KI
Antwort von AI
Deadlock (Verklemmung) ist ein Zustand, in dem zwei oder mehr Threads oder Prozesse sich gegenseitig blockieren, während sie aufeinander warten, um die Ausführung fortzusetzen. Es tritt auf, wenn jeder Thread eine Ressource besitzt, die ein anderer Thread benötigt, und auf die Freigabe dieser Ressource wartet.
Vier Bedingungen, die für das Auftreten eines Deadlocks erforderlich sind (Coffman-Bedingungen):
- Wechselseitiger Ausschluss (Mutual Exclusion): Die Ressource kann nicht gleichzeitig von mehreren Prozessen genutzt werden.
- Halten und Warten (Hold and Wait): Ein Thread, der bereits mindestens eine Ressource besitzt, wartet auf zusätzliche Ressourcen, die von anderen Threads gehalten werden.
- Keine Preemption (No Preemption): Ressourcen können einem Thread nicht gewaltsam weggenommen werden. Sie können nur freiwillig vom Thread freigegeben werden, der sie besitzt.
- Kreisförmiges Warten (Circular Wait): Es gibt einen Zyklus von Wartebedingungen zwischen zwei oder mehr Threads. Zum Beispiel wartet Thread A auf eine Ressource, die von Thread B gehalten wird, der wiederum auf eine Ressource wartet, die von Thread C gehalten wird, der wiederum auf eine Ressource wartet, die von Thread A gehalten wird.
In der iOS-Entwicklung treten Deadlocks häufig bei der Arbeit mit Nebenläufigkeit auf, z.B. bei falscher Verwendung von GCD (Grand Central Dispatch) oder Operation Queues:
- Versuch, einen Codeblock synchron auf einer Queue auszuführen, auf der sich bereits der aktuelle Thread befindet (z.B.
syncauf dermain-Queue vom Hauptthread aus). - Zwei Threads versuchen, zwei Locks oder Semaphoren in unterschiedlicher Reihenfolge zu erwerben.
Ein einfaches Beispiel für einen Deadlock mit GCD:
func deadlockExample() {
// Haupt-Queue
let mainQueue = DispatchQueue.main
// Synchrones Ausführen eines Blocks auf der Haupt-Queue vom Haupt-Thread
// Der Haupt-Thread wartet auf den Abschluss des Blocks,
// und der Block kann nicht ausgeführt werden, weil der Haupt-Thread beschäftigt ist, zu warten.
mainQueue.sync {
print("Diese Zeile wird niemals erreicht.")
}
}