Eine Einführung in die Programmierung von Threads unter Linux
Dieser Text ist eine ziemlich stark komprimierte Einführung in die
Programmierung von Threads in C unter Linux mit Hilfe der
libpthread-Bibliothek, die in allen Distributionen enthalten ist. Er
richtet sich nicht an Programmier-Anfänger. Ebensowenig taugt er als
Referenz - hierfür sind die sehr verständlichen man-pages der einzelnen
Kommandos der Bibliothek wesentlich besser geeignet.
Statt dessen soll er Leuten, die bereits mit C programmiert haben, aber
noch nie Threads eingesetzt haben, einen kurzen Überblick über die
Möglichkeiten und Probleme bei der Programmierung bieten.
Hier nicht oder nur sehr kurz behandelte Themen gibt es einige:
- Scheduling
- Beim Scheduling geht es darum, einzelnen Threads unterschiedliche
Prioritäten zuzuordnen. Dies geht beispielsweise die Frage an, welcher von
mehreren wartenden Threads einen gerade freigegebenen Mutex erhält. Auf für
realtime-Programmierung spielt es eine entscheidende Rolle. In dieser
Einführung werde ich überhaupt nicht auf Scheduling eingehen.
- Einmalig auszuführende Aufgaben
- Initialisierungen werden normalerweise genau ein einziges mal, meist nach
dem Programmstart, ausgeführt. Programmiert man aber beispielsweise eine
Library, so ist dies für einen nicht möglich. Auch dieses Problem werde ich
nur kurz im Abschnitt über Synchronisation von
Threads ansprechen.
- Kompliziertere Arten der Synchronisation
- Mit Hilfe der vorhandenen Mittel der Mutexe und Bedingungs-Variablen kann
man komplizierte Arten von Synchronisation von Threads zusammenbauen. Ein
Problem, welches z.B. häufig auftaucht, ist die Verwaltung einer Queue, aus
der sich Threads Aufgaben holen und diese dann erfüllen. Ich werde hier keine
komplizierteren Beispiele bringen.
- Thread-sicheres I/O
- Da Ein- und Ausgabe-Operationen gepuffert sind, erreicht man selbst mit
einem Mutex nicht so einfach, daß sie nicht durcheinanderkommen. Hierzu gibt
es in der Standard-C-Library die Funktionen flockfile,
funlockfile, bzw. um das locking zu umgehen die Funktionen
getc_unlocked, getchar_unlocked und ebenso mit"put" statt
"get".
- Debuggen von Code mit Threads
- Code, in dem Threads verwendet werden, ist viel schwieriger zu debuggen
als seriell ablaufender Code. Es gibt einige Debugger, die einen dabei zu
unterstützen versuchen. Genaueres weiß ich aber sowieso nicht.