Einführung in die Multithreading-Programmierung

Die meisten Programme mit mehreren Threads müssen den einzelnen Strängen den Zugriff auf gemeinsame Daten ermöglichen. Das kann eine Datenbank sein, ein Sprach-Container oder sogar ein einfacher Zähler. Auf gemeinsam genutzte Daten zuzugreifen und diese zu modifizieren, verursacht möglicherweise eine Wettlaufsituationen (race conditions). Diese Konflikte bewirken, dass das Ergebnis eines Programms unterschiedlich ausfällt, je nachdem, wie das Ausführen der einzelnen Threads untereinander erfolgt. Die unterschiedliche Ausführungsreihenfolge der Threads birgt die Gefahr falscher Ergebnisse oder sogar eines Absturzes.

Das folgende Beispiel ist eine blockierende Warteschlange. Ein Thread fügt Elemente zur Warteschlange mit enqueue hinzu und entfernt sie wieder mit dequeue. Falls die Warteschlange leer ist, wenn dequeue aufgerufen wird, wartet der Strang darauf, dass ein anderer Thread etwas zur Warteschlange hinzufügt.

Der Code ist recht einfach und scheint auf den ersten Blick korrekt zu sein. Eine bestimmte Reihenfolge von Ereignissen kann das Programm jedoch zum Absturz bringen. Man stelle sich folgende Situation vor: Die Warteschlange hat die Größe eins und zwei Threads (A und B) rufen die dequeue-Methode auf. Unter den vielen möglichen unterschiedlichen Verschränkungen der beiden Threads führen die folgenden zwei zu einer Wettlaufsituation:


A: while (queue.size() == 0)
A: return queue.remove(0)
B: while (queue.size() == 0)
B: while (queue.size() == 0)
-
A: while (queue.size() == 0)
B: while (queue.size() == 0)
A: return queue.remove(0)
B: return queue.remove(0)

Bei der ersten Verschränkung entnimmt Thread A das einzige Element der Warteschlange. Dann tritt Thread B in eine Endlosschleife ein, während er darauf wartet, dass ein anderer Thread der Warteschlange ein Element hinzufügt. Bei der zweiten Verschränkung erkennt hingegen Thread A, dass die Warteschlange nicht leer ist, so dass die Schleifenbedingung erfüllt ist. Ehe A aber das Element aus der Warteschlange entfernen kann, kommt Thread B und erfüllt ebenfalls die Schleifenbedingung. Jetzt haben beide Threads die Schleifenbedingung erfüllt und beide versuchen, ein Element aus der Warteschlange zu entfernen, obwohl diese nur ein Element enthält. Dies ist ein typisches Beispiel dafür, wie eine Race-Condition ein Programm zum Absturz bringen oder unerwartete Ergebnisse produzieren kann.

Das Verschränken von Threads im obigen Beispiel findet auf Code-Ebene statt. In der Praxis tritt es aber eher auf der Befehlsebene auf. Es ist auf jeden Fall sehr gefährlich, wenn zwei Threads gemeinsam genutzte Daten gleichzeitig modifizieren. Das gilt selbst dann, wenn es nur darum geht, einen Zähler zu inkrementieren.

Glücklicherweise bieten fast alle wichtigen Programmiersprachen oder ihre Bibliotheken geeignete Werkzeuge, um Race-Conditions zu vermeiden. Die drei wichtigsten Tools sind Sperren (locks), Bedingungsvariablen (condition variables) und Monitore.

Page: 1 2 3 4 5 6

ZDNet.de Redaktion

Recent Posts

Digitale Produkte „cyberfit“ machen

Vernetzte Produkte müssen laut Cyber Resilience Act über Möglichkeiten zur Datenverschlüsselung und Zugangsverwaltung verfügen.

3 Tagen ago

Google schließt schwerwiegende Sicherheitslücken in Chrome 131

Das jüngste Update für Windows, macOS und Linux stopft drei Löcher. Eine Anfälligkeit setzt Nutzer…

3 Tagen ago

Apple schließt Zero-Day-Lücken in iOS, iPadOS und macOS

Zwei von Google-Mitarbeitern entdeckte Schwachstellen werden bereits aktiv gegen Mac-Systeme mit Intel-Prozessoren eingesetzt. Sie erlauben…

3 Tagen ago

Gefährliche Anzeigen für Passwortmanager Bitwarden verbreiten Malware

Die Hintermänner haben es unter anderem auf Daten von Facebook-Geschäftskonten abgesehen. Opfer werden über angebliche…

4 Tagen ago

Public Cloud: Gartner erwartet 2025 weltweite Ausgaben von 723 Milliarden Dollar

Bis 2027 werden 90 Prozent der Unternehmen eine Hybrid-Cloud-Strategie umsetzen.

4 Tagen ago

iPhone 15 ist bestverkauftes Smartphone im dritten Quartal

Apple belegt in der Statistik von Counterpoint die ersten drei Plätze. Samsungs Galaxy S24 schafft…

4 Tagen ago