Threads - Einführung

Martin Kompf

Mit Multithreading wird die Fähigkeit eines Programms bezeichnet, mehrere Aktivitätsstränge (Threads) parallel auszuführen.

Der klassische Unix- oder Windows-Prozess erlaubt nur die Ausführung eines einzigen Aktivitätsstranges. Das heisst, alle vom Programmierer kodierten Anweisungen werden in einer bestimmten Reihenfolge streng sequentiell hintereinander ausgeführt. Die Einführung des Multithreadingkonzepts hingegen versetzt einen Prozess in die Lage, mehrere Aktivitätsstränge gleichzeitig parallel auszuführen. Diese Aktivitätsstränge werden als »Threads« bezeichnet. Sinnvolle Anwendungen für Multithreading sind zum Beispiel:

Bei der Softwareimplementierung muss berücksichtigt werden, dass die in einem Prozess laufenden Threads einen Teil der Programmressourcen gemeinsam nutzen.

Der von allen Threads eines Prozesses genutzte gemeinsame Kontext beinhaltet:

Jeder Thread besitzt auch einen privaten Kontext, nämlich:

Eine Parallelverarbeitung lässt sich natürlich auch durch den Einsatz mehrerer Prozesse erreichen, wie es im Artikel Memory Mapped Files beschrieben wurde. Der große Vorteil von Threads gegenüber diesem Modell ist jedoch, dass eine Kontextumschaltung von Thread zu Thread um ein Vielfaches schneller erfolgen kann, als zwischen verschiedenen Prozessen. Auch kann der Datenaustausch zwischen den Threads direkt über den gemeinsam genutzten Kontext erfolgen. Der Programmierer muss dafür keine zusätzlichen IPC-Mechanismen verwenden.

Das Vorhandensein des gemeinsamen Kontextes lädt - neben allen Vorteilen - eine große Verantwortung auf die Schultern des Programmierers. Dieser muss bei der Softwareentwicklung eine Vielzahl von Dingen bedenken, unter anderem:

Da Threads erst relativ spät »entdeckt« worden sind, gibt es soviel verschiedene Implementierungen wie Betriebssysteme. Der populärste und am häufigsten genutzte Standard ist POSIX Pthreads, von dem es wieder jede Menge Implementierungen gibt. Die Windows SDK hat ebenfalls eine eigene (nicht POSIX konforme) Threadimplementierung. Für den Entwickler portabler Software kompliziert sich die Sache daher noch mehr, als Lösung hierfür gibt es zum Beispiel das Paket JThreads/C++, welches die identische (und einfache) Verwendung von Threads unter Windows und den populären Unixen erlaubt. Eine Beispielapplikation, die auf der Basis von JThreads/C++ eine Einführung in die Programmierung von Threads mit C++ gibt, wird in der nächsten Artikelfolge vorgestellt.