Locks stellen ein einfaches Konzept dar, das die grundlegenden Elemente für fast alle Multithreading-Programme liefert. Die Idee, die hinter einem Lock steht, ist unkompliziert: Nur ein Thread kann einen Lock erhalten. Nach Beendigung seiner Aufgabe muss er ihn wieder freigeben. Falls ein anderer Thread versucht, den Lock zu erhalten, muss er bis zur Freigabe warten. Erst dann kann er ihn selbst nutzen und in der Ausführung fortfahren.
Locks lassen sich verwenden, um Bereiche des Codes zu definieren, die zu einer Zeit jeweils nur ein Thread ausführen können (mutual exclusion zones). Dies beseitigt das Problem, dass mehrere Threads gemeinsam genutzte Daten bei unvorhersehbar verschränkter Ausführung korrumpieren.
Hier ein modifiziertes Warteschlangen-Beispiel, das keine Probleme mit Verschränkungen erzeugt.
Damit wurde die neue Variable lock eingeführt. lock.lock() bedeutet, dass der Thread versucht, das Lock zu erhalten, und es dann per lock.unlock() wieder freigibt. Falls ein anderer Thread versucht, eine übernommene Lock-Variable zu erhalten, wartet er, bis diese freigeben ist. Nur ein Thread darf die Überprüfung der Größe und das Entfernen zur selben Zeit durchführen. Dadurch gibt es keine Probleme mehr mit verschränkten Threads.
Es gilt zu beachten, dass nicht einfach die gesamte dequeue-Methode in eine mutual exclusion zone umgewandelt wird. Wenn der Thread in die Schleife eintritt, würde er sonst das Lock niemals freigeben und einem anderen Thread erlauben, der Warteschlange etwas hinzuzufügen. Daraus resultiert eine Endlosschleife, in Threading-Kreisen deadlock genannt.
Neueste Kommentare
Noch keine Kommentare zu Einführung in die Multithreading-Programmierung
Kommentar hinzufügenVielen Dank für Ihren Kommentar.
Ihr Kommentar wurde gespeichert und wartet auf Moderation.