Einführung in die Multithreading-Programmierung

Monitore stellen eine gute Möglichkeit dar, die Funktionalität von Locks und Bedingungsvariablen in einem standardmäßigen Klassendesign zu verkapseln. Ein Monitor ist eine Klasse mit eingebautem Lock und Bedingungsvariable. Beim Aufruf einer Klassenmethode wird das Lock erhalten und wieder freigegeben, sobald die Methode zurückkehrt. Das bedeutet, dass zwei Threads nicht zur selben Zeit eine Methode desselben Objekts aufrufen können. So wird die innere Programmlogik vor Race-Conditions und Datenkorruption geschützt.

Es gibt allerdings auch Situationen, in denen innerhalb einer Monitor-Methode auf eine bestimmte Statusbedingung gewartet werden soll. Die oben gezeigte ursprüngliche Methode mit der Endlosschleife würde ein Deadlock verursachen. Denn der Lock des Monitors bliebe zugewiesen, bis der Thread die Endlosschleife beendet hat. Damit könnte kein anderer Thread auf die Methoden des Monitors zugreifen, um dessen Status zu modifizieren. Damit man dieses Problem umgehen kann, bieten Monitore außerdem die Funktionalität einer Bedingungsvariablen.

Monitore lassen sich in Java erstellen, indem der Deklaration der Methode, die als Locking-Methode fungieren soll, der Schlüsselbegriff synchronized vorangestellt wird. Java-Monitore stellen geschützte Methoden bereit, um auf die Bedingungsvariable des Monitors zu warten und diese zu benachrichtigen.

Das Warteschlangen-Beispiel wird jetzt so verändert, dass es Javas Monitor-Funktionalität verwendet. Dadurch entsteht der bisher am besten lesbare Code.


Die Muster beachten

Damit wurden die drei wichtigsten Tools für Multithreading in Programmiersprachen wie Java und C/C++ vorgestellt. Für Multithreading-Programmierung in C++ mithilfe ähnlicher Konzepte und Werkzeuge wie in Java empfiehlt sich die Verwendung der Boost.Thread-Bibliothek. Allerdings umfasst Multithreading wesentlich mehr als nur Programmierwerkzeuge. Der Trick besteht darin, sich mit den gängigen Mustern vertraut zu machen, die in den unterschiedlichen Anwendungen auftauchen.

Beim Entwickeln einer Multithreading-Lösung sollten unbedingt deren spezifische Aufbaumuster Beachtung finden. Sonst wird in neun von zehn Fällen das Rad neu erfunden. Das vorangegangene Beispiel der blockierenden Warteschlange stellt eine einfache Implementierung des Producer-Consumer-Modells dar. Ein anderes Beispiel wäre das Readers-Writers-Problem. Es gestattet beim Lesen mehreren Threads gleichzeitig den Zugriff auf eine Ressource, beim Schreiben hingegen nur einem Thread.

Themenseiten: Anwendungsentwicklung, Software

Fanden Sie diesen Artikel nützlich?
Content Loading ...
Whitepaper

Artikel empfehlen:

Neueste Kommentare 

Noch keine Kommentare zu Einführung in die Multithreading-Programmierung

Kommentar hinzufügen

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *