Kapitel 10 Threads
Neben den Prozessen existiert noch eine andere Form der Programmausführung, die Linux unterstützt – die Threads, die auch als »leichtgewichtige« Prozesse bekannt sind.
Mit der Thread-Programmierung können Sie Anwendungen schreiben, die erheblich schneller und parallel ablaufen. Sie erhalten in diesem Kapitel einen Einblick in die Thread-Programmierung unter Linux und erfahren, wie Sie diese Kenntnisse in der Praxis einsetzen können.
Hinweis Die Beispiele im Buch verwenden Linux-Threads und sind somit nicht ohne weiteres auf anderen UNIXen lauffähig. Die BSD-Threads z. B. arbeiten zum Teil ähnlich. Es kann aber sein, dass das eine Programm läuft und ein anderes nicht und daher auf die Linux-Threads verlinkt werden muss. Voraussetzung sind also Linux-Threads. Speziell unter (Free)BSD müssen Sie die Linux-Threads aus den Ports installieren und das Programm folgendermaßen übersetzen:
$ gcc -o thserver thserver.c \
-I/usr/local/include/pthread/linuxthreads \
-L/usr/local/lib -llthread -llgcc_r
|
10.1 Unterschiede zwischen Threads und Prozessen
 
Prozesse wurden ja bereits ausführlich erklärt. Sie wissen, wie Sie eigene Prozesse mittels fork() kreieren können, und mit Interprozesskommunikationen (IPC) haben Sie erfahren, wie man einzelne Prozesse synchronisiert. Den Aufwand, den Sie bei den Interprozesskommunikationen gemacht haben, entfällt bei den Threads fast komplett.
Ein weiterer Nachteil bei der Erstellung von Prozessen gegenüber Threads ist der enorme Aufwand, der mit der Duplizierung des Namensraumes gemacht wird – den man mit den Threads nicht hat, da diese in einem gemeinsamen Adressraum ablaufen. Somit stehen den einzelnen Threads dasselbe Codesegment, Datensegment, der Heap und alle anderen Zustandsdaten, die ein »gewöhnlicher« Prozess besitzt, zur Verfügung – was somit auch die Arbeit beim Austausch von Daten und bei der Kommunikation untereinander erheblich erleichtert. Weil aber kein Speicherschutzmechanismus unter den Threads vorhanden ist, bedeutet dies auch, wenn ein Thread abstürzt, reißt dieser alle anderen Threads mit.
Im ersten Moment besteht somit vorerst gar kein Unterschied zwischen einem Prozess und einem Thread, denn letztendlich besteht ein Prozess mindestens aus einem Thread. Ferner endet ein Prozess, wenn sich alle Threads beenden. Somit ist der EINE Prozess (dieser eine Prozess ist der erste Thread, auch »Main Thread« bzw. »Haupt-Thread« genannt) verantwortlich für die gleichzeitige Ausführung mehrerer Threads – da doch Threads auch nur innerhalb eines Prozesses ausgeführt werden. Der gravierende Unterschied zwischen den Threads und den Prozessen besteht darin, dass Threads unabhängige Befehlsfolgen innerhalb eines Prozesses sind. Man könnte auch sagen, Threads sind in einem Prozess gefangen oder verkapselt – im goldenen Käfig eingeschlossen.
Natürlich müssen Sie dabei immer im Auge behalten, wenn Threads denselben Adressraum verwenden, dass sich alle Threads den statischen Speicher und somit auch die globalen Variablen miteinander teilen. Ebenso sieht dies mit den geöffneten Dateien (z. B. Filedeskriptoren), Signalhandler- und Einstellungen, Benutzer- und Gruppenkennung und dem Arbeitsverzeichnis aus. Daher sind auch in der Thread-Programmierung gewisse Synchronisationsmechanismen nötig und auch vorhanden.
|