Home » Tutorials » Object Pascal/RTL » Threads

Threads

Multithreading

Jede Anwendung besteht also aus mindestens einem Thread, dem primären Thread. Dafür muss nichts Besonderes getan werden. Interessant wird es erst, wenn man weitere Threads einsetzen will, um die Rechenzeit des Prozessors besser auszunutzen und um die Anwender nicht mit Sanduhren warten zu lassen.

Nebenstehende Grafik zeigt den Ablauf einer Anwendung (Prozess) mit ihrem primären Thread (roter Pfeil). Zwischendrin wird ein zweiter Thread erzeugt (dunkelroter Pfeil), der irgendwelche Aufgaben im Hintergrund und gleichzeitig zum Ablauf des primären Threads erledigt.
Als Beispiel kann man sich die Rechtschreibprüfung in Word vorstellen, die den Text überprüft, ohne den Anwender derweil mit einer Sanduhr zum Warten zu zwingen.
Allgemein gilt, dass Multithreading (also der Einsatz mehrerer Threads innerhalb eines Prozesses) verwendet werden sollte, wenn sich dadurch die Rechenzeit besser ausnutzen lässt.
Dabei sollten auch die Nachteile berücksichtigt werden:

  • Jeder Thread muss verwaltet werden, was eine Anwendung langsamer macht und Arbeitsspeicher benötigt. Nicht umsonst weist Borland darauf hin, dass bei einem Ein-Prozessor-System 16 aktive Threads eine praktikable Obergrenze darstellen.
  • Da mehrere Threads gleichzeitig Daten ändern können, muss darauf geachtet werden, dass keine Probleme auftreten. Dies kann beispielsweise durch den Einsatz von kritischen Abschnitten (Critical Section) geschehen. Dadurch wird gewährleistet, dass sich immmer nur ein einziger Thread in einem Abschnitt befindet. Alle anderen Thread müssen warten, bis dieser fertig ist, bevor sie diesen Abschnitt ebenfalls durchlaufen können. Besonders bei Mehrprozessorsystemen, auf denen Threads wirklich gleichzeitig ablaufen können, muss man als Programmierer sehr vorsichtig sein.

Letzterer Punkt bezieht sich auf synchronisiertes Multithreading. Natürlich kann es auch unsynchronisiertes Multithreading geben. Dabei sind die Threads voneinander völlig unabhängig und dürfen auch nicht auf globale Variablen zugreifen. Dies ist für den Programmierer am einfachsten umzusetzen, jedoch in der Praxis recht selten.
In der Regel wird synchronisiertes Multithreading eingesetzt. Darum geht es auch im nächsten Abschnitt.