attr ist ein Zeiger auf den Arbeitsbereich des Fadens
f ist die auszuführende Funktion
arg ist ein Zeiger auf die Argumente mit der f ausgeführt werden soll
Rückgabewerte:
=0 bei Erfolg
!=0 bei Misserfolg
In f: pthread_exit(p): Beendet Faden und liefert Zeiger p zurück
Beispiel eines POSIX-Fadens
Faden mit Hauptprozess zusammenführen
pthread_join(&thread, &q) legt den aufrufenden Faden/Prozess schlafen, bis der Faden thread terminiert
q ist eine Zeigervariable, die mit dem durch pthread_exit(p) zurückgegebenen Zeiger p überschrieben werden soll
POSIX-Fäden vergleichen und Identität feststellen
pthread_equal(&thread1, &thread2)
liefert einen Wert ungleich 0 zurück, falls es sich um den selben Faden handelt
pthread_self() liefert die ID eines Fadens als Rückgabewert
Ein Beispiel mit zwei Fäden
Wettlaufsitaution
Semaphore
Ein Semaphor (σῆμα dt. Zeichen, φέρειν dt. tragen) ist eine Datenstruktur zur Verwaltung beschränkter Ressourcen in digitalen Systemen
Analogie: Eisenbahnsignal
Semaphore
Die Semaphor wird als Zähler mit der maximalen Anzahl n der entsprechenden Ressource initialisiert: s := n
P(): Prolaag = probeer te verlagen (dt. versuche zu senken)
s>0: Ressource wird beansprucht und s := s−1
s=0: Warten bis Ressource wieder verfügbar ist: s>0
V(): Verhogen bzw. vrijgeven dt. freigeben: s := s+1
Aufgabe
Aufgabe
Aufgabe
Aufgabe
Aufgabe
Aufgabe
Aufgabe
POSIX-Semaphore
sem_init(&s, 0, x) initialisiert ein Semaphor s mit dem Wert x
sem_destroy(&s) zerstört ein Semaphor s
sem_getvalue(&s, &v) schreibt Wert des Semaphors s in v
P(): sem_wait(&s)
V(): sem_post(&s)
Rückgabewerte:
0 bei Erfolg
≠ 0 bei Misserfolg
Binäre Semaphore und Schlossvariablen
Nimmt ein Semaphor ausschließlich die Werte 0 und 1 an, spricht man von einem binären Semaphor
Wird ein binärer Semaphor stets von dem Aktivitätsträger wieder freigegeben der diesen auch gesperrt hat, spricht man von einem gegenseitigen Ausschluss (engl. mutual exclusion bzw. Mutex) bzw. einer Schlossvariablen (Lock)
Initialisieren und zerstören von POSIX-Schlössern
pthread_mutex_init(&s, attr) initialisiert Schloss s (ungesperrt)
pthread_mutex_destroy(&s) zerstört ein Schloss s
const pthread_mutexattr_t* attr ist ein Zeiger auf weitere Attribute und wird meist auf NULL gesetzt