Einige Hinweise zu den Multithreading-Beispielen

 

Wenn Sie heute einen modernen PC (oder auch ein Smartphone) betrachten, ist dieser vermutlich mit einer Mehrkern-CPU ausgestattet. Mit ihrer Hilfe sind Sie in der Lage, mehrere Programme - eines pro Kern - echt parallel auszuführen. Was für uns heutzutage als selbstverständlich gilt, war nicht immer so. In den guten alten Zeiten mit Betriebssystemen wie MS-DOS oder CP/M konnte immer nur ein Programm sequentiell ausgeführt werden. Diese Form der Ausführung von Programmen war natürlich mit erheblichen Nachteilen verbunden. Wollten Sie eine so uninteressante Tätigkeit wie das Drucken eines Dokuments oder einfach auch nur lang andauernde Berechnungen ausführen, war der ganze Rechner für diese Zeitdauer blockiert. Noch unangenehmer wurde es, wenn sich ein Programm aufgehängt hat, was es ja ab und zu geben soll. In diesem Fall war in den meisten Fällen der gesamte Rechner abgestürzt, und man musste sich mit einem Reboot behelfen.

Die Multithreading-Technologie hat hier Abhilfe geschaffen. Multithreading ist ein Hilfsmittel, um mehrere Aktivitäten in einem Prozess quasi- oder echt-parallel auszuführen. Auf einem Mehrprozessorkern können mehrere Aktivitäten gleichzeitig ausgeführt werden. Und selbst auf einem Einprozessorkern lässt sich durch schnelles Abwechseln mehrerer Anwendungen (Threads) eine Scheinparallelität erzeugen. Die Langeweile von lang andauernden Aktivitäten ist so nicht mehr vorhanden.

Der Einsatz von mehreren Threads in einer Anwendung kann aber auch Probleme nach sich ziehen. In der Praxis kommt es sehr häufig vor, dass mehrere Threads gleichzeitig auf dasselbe Objekt / dieselbe Variable zugreifen wollen. Dabei kann es zu unerwarteten Ergebnissen kommen, wenn ein Thread den Wert einer Variablen ändern möchte, dabei aber auf Grund des Zeitscheibenverfahrens (Timeslicing) unterbrochen wird und ein weiterer Thread dieselbe Variable verwenden möchte. Zu diesem Zweck müssen mehrere Threads synchronisiert werden. Was sich genau dahinter verbirgt, wird an zahlreichen Übungsaufgaben demonstriert und vertieft. Es kommen sowohl die im Windows Betriebssystem tief verankerte Klasse Thread (Namensraum System.Threading) zum Einsatz sowie die auf Mehrkernrechner zugeschnitte Klassenbibliothek TPL (Task Parallel Library). Die für den Einsatz der TPL empfohlenen LINQ-Ausdrücke fehlen ebenfalls nicht.

Dem Thema „Multithreading und Oberflächen“ wird ebenfalls ein größerer Spielraum eingeräumt. Nahezu alle ambitionierten Oberflächenbibliotheken besitzen Einschränkungen, wenn der Zugriff auf die Anwendungsoberfläche aus einem beliebigen Worker-Thread heraus erfolgt. Bei der WPF gibt es zu diesem Zwecke das Hilfsmittel der Klasse Dispatcher. Sie stellt Dienstleistungen zur Verfügung, um letzten Endes doch im Kontext eines beliebigen Threads Änderungen an der Oberfläche vornehmen zu können.