Multithreading. Ein Erfahrungsbericht von Dr. Johannes Gomolka (Berlin).

Für einen Projektmanager gehören Multithreading-Fehler zu den bittersten Erfahrungen. Dieser Artikel zeigt was technisch dahinter steckt, und was man dagegen tun kann. Die Programmierer unter Ihnen mögen die einfachen Erklärungen verzeihen.

Zunächst einmal die Grundlage: Was ist Multithreading? Beim Multithreading geht es darum, die Prozesse innerhalb einer Software in Arbeitspakete aufzuteilen, die gleichzeitig und unabhängig voneinander ablaufen können. Diese Arbeitspakete werden in sogenannten Threads zusammengefasst, die möglichst gleichzeitig ablaufen. Das ist die unterste Ebene eines Software-Systems. Der Systemkern.

Das Problem: Die Threads innerhalb eines Systemkerns müssen perfekt abgestimmt werden, koordiniert und synchronisiert ablaufen. Je mehr Threads ein System benutzt und je komplexer die Abfragen, desto mehr Threads werden eröffnet, die abgearbeitet werden müssen. Jetzt kann es passieren, dass die Threads nicht sauber koordiniert werden, sich gegenseitig behindern oder gar überlaufen. Der Fehler ist dann für einen Außenstehenden kaum erkennbar, weil die Funktionen der Software alle ordnungsgemäß funktionieren, aber die Software selbst nicht funktionsfähig ist.

Fehler nicht replizierbar

Man kann diese Fehler keiner einzelnen Funktion mehr zuordnen, sondern die Fehler kommen dem Tester nur als Artefakte vor.

Der Vergleich: Stellen Sie sich ein klassisches Orchester vor, dass aus vielen einzelnen Musikern besteht die gemeinsam eine Symphonie spielen. Wenn während eines Konzerts einer der Musiker nicht mehr nach Noten spielt, der Dirigent in den Orchestergraben fällt oder der Vorhang von der Bühne fällt, dann gibt es Katzenmusik. Ähnlich ist es beim Multithreading. Einzelne Threads können zusammenbrechen, kritische Systemabläufe behindern oder das System einfrieren.

Neben Thread Deadlock, Thread Livelock ist das wohl wichtigste die Thread Starvation (das Aushungern eines Threads). Dabei werden Systemressourcen an dominante Threads vergeben, die dann das Einbringen und Abarbeiten neuer Arbeitsaufgaben behindern. Beispielsweise zeigt eine Applikation immer weniger Reaktionen. Andere Probleme sind hier Thread Death, Thread Trash und Thread Leaks.

Multithreading vermeiden

Die Lösung: Ein Software-Framework das auf seine Belastungsfähigkeit getestet und vorbereitet wurde, wird weniger Multithreading Probleme aufweisen, als eine nur wenig getestete Software. Isolierte Tests helfen hier nicht weiter, sondern man muss voraussehen, welche Threads zu Problemen führen oder am besten eine Software-Architektur vermeiden, die potentiell fehleranfällig beim Multithreading ist. Viel wichtiger jedoch man sollte immer vermeiden, eine solche System-Architektur zu wählen, die möglichst viele Aufgaben gleichzeitig erledigt. Kann man die Fehler nicht mehr identifizieren, weil der Code zu komplex und zu groß geworden ist, bleibt nur der Weg bestimmte Programmteile neu & einfacher zu schreiben.

Additional information