Threadsicherheit
Threadsicherheit (englisch thread safety) ist eine Eigenschaft von Softwarekomponenten und hat eine wichtige Bedeutung in der Softwareentwicklung. Sie besagt, dass eine Komponente gleichzeitig von verschiedenen Programmbereichen mehrfach ausgeführt werden kann, ohne dass diese sich gegenseitig behindern.
Teile eines Computerprogramms können zum selben Zeitpunkt mehrmals ausgeführt werden. Dabei handelt es sich oft um eine Komponente oder auch nur um eine Funktion des Programms. Zum Zweck der Mehrfachausführung bieten Betriebssysteme sogenannte Threads an. Jeder Thread arbeitet dabei unabhängig von den anderen diesen Programmteil ab. Häufig muss das Programm dabei gleichzeitig auf einen gemeinsamen Speicherbereich (Shared Memory) des Computers zugreifen. Änderungen der einzelnen Threads müssen koordiniert werden, um einen chaotischen Zustand des Speichers zu verhindern. Man spricht hier auch von Synchronisation. Zum Zweck der Threadsynchronisation existieren mehrere Konzepte, wie z. B. Locks (engl. für Sperre: Ein Thread sperrt einen Speicherbereich zur exklusiven Bearbeitung, andere Threads haben währenddessen keinen Zugriff auf diesen Speicherbereich, bis dieser wieder freigegeben wird), Mutexe und Semaphore.
Ist der gleichzeitige Zugriff mehrerer Threads möglich, so bezeichnet man die Komponente auch als eintrittsinvariant oder reentrant.
Inkonsistenzen
Die gleichzeitige Manipulation von Daten durch mehrere Threads kann zu sogenannten inkonsistenten Daten führen. Das geschieht, wenn ein Thread Daten ändert, weitere Threads dies aber nicht erfahren und weiterhin den alten Zustand der Daten annehmen. Fortlaufende Berechnungen basieren nun auf nicht mehr aktuellen Daten und sind somit falsch. Ein Beispiel für diese Problematik ist die Race Condition.
Beispiele
Gehaltsdaten
Eine Komponente dient zum Verwalten von Gehaltsdaten. Das Programm kann gleichzeitig von zwei Personalmitarbeitern verwendet werden. Angenommen Mitarbeiter A erhöht das Gehalt eines Angestellten von 1000,00 Euro um einen Inflationsausgleich von 100,00 Euro. Nahezu gleichzeitig erhöht Mitarbeiter B das Gehalt ebenfalls um 200,00 Euro wegen besonderer Leistung. Insgesamt soll sich das Gehalt auf 1300,00 Euro erhöhen.
Bei Verwendung nicht threadsicherer Software kann es zu folgender Bearbeitungsabfolge kommen:
- Mitarbeiter A liest das aktuelle Gehalt (1000,00 Euro).
- Mitarbeiter B liest das aktuelle Gehalt (1000,00 Euro).
- Mitarbeiter A erhöht das aktuelle Gehalt um 100,00 Euro und speichert 1100,00 Euro.
- Mitarbeiter B erhöht das aktuelle Gehalt um 200,00 Euro und speichert 1200,00 Euro.
Ursache ist, dass bei der zweiten Änderung die erste nicht bekannt war. Es werden also lediglich 200,00 Euro auf das Ursprungsgehalt addiert. Die erste Änderung wird überschrieben und ist verloren (sog. „Lost Update“-Problem).
Änderungen einer MediaWiki-Seite
Ein Beispiel für eine threadsichere Applikation ist MediaWiki. Es ist möglich, dass zwei Autoren dieselbe Seite zum selben Zeitpunkt ändern. Der Autor, der die Seite als zweites speichert, erhält von der Software eine Warnung und den Hinweis, dass es bereits eine Änderung gab. Es liegt nun in seiner Verantwortung, diesen Konflikt zu lösen, ohne den vorherigen Beitrag zu überschreiben.
Synchronisation in Programmiersprachen
Manche Elementarfunktionen von Programmiersprachen, die nur lokale Variablen bearbeiten, sind immer threadsicher, so zum Beispiel die meisten mathematischen Funktionen, die Zwischenergebnisse immer auf dem Stack ablegen und immer auf Kopien der Originalvariablen arbeiten.