Parallelzugriff auf Daten
Teil 4: Programmieren für Multi-Core-Prozessoren
Deadlocks durch Schreib-/Lesesperren
Bei der Anforderung von Locks durch mehrere Threads können prinzipiell auch so genannte Deadlocks auftreten. Dies gilt immer dann, wenn mehrere Threads mehrere Locks beanspruchen, diese in unterschiedlicher Reihenfolge aufrufen und jeweils der andere Thread einen Lock belegt.
Der folgende skizzierte Ablauf soll dies verdeutlichen:
-
Thread_A fordert Lock_A an und erhält es
-
Thread_B fordert Lock_B an und erhält es
-
Thread_A fordert Lock_B an - da dieses belegt ist, wird Thread_A verdrängt
-
Thread_B fordert Lock_A an - da dieses belegt ist, wird Thread_B verdrängt
Um das zu umgehen, wird vorher geprüft, ob ein Lock verfügbar wäre. Ist dies der Fall, so wird die Sperre dem anfordernden Thread zugewiesen. Andernfalls wird eine bestimmte Zeit abgewartet und dann der Versuch abgebrochen, den Lock zu erhalten. .Net kennt dazu für jede Enter-Methode eine Variante mit „Try“. Diese beinhalten das Timeout.