B.12 Threadprogrammierung
Anhand des Präfix der Pthread-Funktionen lassen sich diese ordentlich in eine Gruppe einsortieren. Hier ein schneller Überblick dazu.
Tabelle B.60
Verschieden Präfixe von Threadfunktionen
Präfix
|
Gruppe
|
pthread_
|
Threads selbst mit verschiedenen Unterfunktionen
|
pthread_attr_
|
Thread-Eigenschaften
|
pthread_mutex_
|
Mutexe
|
pthread_mutexattr_
|
Mutex-Eigenschaften
|
pthread_cond_
|
Condition Variablen
|
pthread_condattr_
|
Eigenschaften von Condition Variablen
|
pthread_key_
|
spezifische Thread-Daten-Schlüssel
|
Insgesamt beinhaltet die Pthread-API über 60 Funktionen und zum Übersetzen müssen Sie die Headerdatei <pthread. h.> einbinden und die Bibliothek (-lpthread) hinzulinken.
B.12.1 Thread-Verwaltung
Tabelle B.61
Funktionen zur gewöhnlichen Thread-Verwaltung
Syntax
|
Bedeutung
|
int pthread_create(
pthread_t * thread,
pthread_attr_t * attr,
void * (*start_routine)
(void *),
void * arg);
|
Thread erzeugen
|
void pthread_exit(void *retval);
|
Thread beenden
|
int pthread_join(
pthread_t th,
void **thread_return);
|
Auf die Beendigung von Threads warten
|
pthread_t pthread_self(void);
|
Threads identifizieren
|
int pthread_equal(
pthread_t thread1,
pthread_t thread2);
|
Threads vergleichen
|
int pthread_detach(
pthread_t th);
|
Einen Thread von den anderen Absondern in dem dieser anhand der Leistung und Performance ein wenig optimiert wird. Dies wird erreicht, indem dieser Thread bei Beendigung sofort terminiert und freigegeben wird. Allerdings kann dieser Thread nicht mehr mit pthread_join() synchronisiert werden.
|
B.12.2 Attribute von Threads und das Scheduling erfragen
Tabelle B.62
Attribute und Scheduling von Threads ermitteln
Syntax
|
Bedeutung
|
int pthread_attr_init(
pthread_attr_t *attr);
|
Attributvariable initialisieren
|
int pthread_attr_getdetachstate(
const pthread_attr_t *attr,
int *detachstate);
|
Abfragen ob der Thread PTHREAD_CREATE_DETACHED ist, also b. Beendigung sofort freigegeben wird oder ob PTHREAD_CREATE_JOINABLE (Standard) gesetzt ist, womit sich der Thread besser synchronisieren lässt.
|
int pthread_attr_getschedpolicy(
const pthread_attr_t *attr,
int *policy );
|
Die Prioritäten eines Threads abfragen. Mögliche Werte: SCHED_OTHER (normal, keine Echtzeit), SCHED_FIFO (hoch, Echtzeit) und SCHED_RR (hoch, Echtzeit Round-Robin)
|
int pthread_attr_getinheritsched(
const pthread_attr_t *attr,
int *inherit);
|
Werden die Scheduling-Eigenschaften des Vaterthreads, beim Erzeugen eines neuen Threads übernommen (PTHREAD_INHERIT_SCHED) oder nicht (PTHREAD_EXPLICIT_SCHED).
|
int pthread_attr_destroy(
pthread_attr_t *attr);
|
Attributvariable wieder freigeben
|
B.12.3 Attribute und das Scheduling von Threads setzen
Tabelle B.63
Attribute und Scheduling von Threads setzen
Syntax
|
Bedeutung
|
int pthread_attr_init(
pthread_attr_t *attr);
|
Attributvariable initialisieren
|
int pthread_attr_setdetachstate(
pthread_attr_t *attr,
int detachstate);
|
Setzen der Eigenschaft PTHREAD_CREATE_DETACHED oder PTHREAD_CREATE_JOINABLE (Standard) für einen Thread.
|
int pthread_attr_setschedpolicy(
pthread_attr_t *attr,
int policy);
|
Prioritäten für einen Thread setzen. Mögliche Werte: SCHED_OTHER (normal, keine Echtzeit), SCHED_FIFO (hoch, Echtzeit) und SCHED_RR (hoch, Echtzeit Round-Robin)
|
int pthread_attr_setinheritsched(
pthread_attr_t *attr,
int inherit);
|
Einstellen, ob, die Scheduling-Eigenschaften vom Vaterthread an den Kindthread vererbt werden soll (PTHREAD_INHERIT_SCHED) oder nicht (PTHREAD_EXPLICIT_SCHED).
|
int pthread_attr_destroy(
pthread_attr_t *attr);
|
Attributvariable wieder freigeben
|
B.12.4 Mutex-Variablen
Tabelle B.64
Funktionen zum Arbeiten mit Mutex
Syntax
|
Bedeutung
|
int pthread_mutex_lock(
pthread_mutex_t *mutex);
|
Mutex anlegen (initialisieren)
|
int pthread_mutex_lock(
pthread_mutex_t *mutex);
|
Mutex sperren (blockiert ggf. bis Mutex frei wird – falls gesperrt)
|
int pthread_mutex_trylock(
pthread_mutex_t *mutex);
|
Mutex sperren (ohne blockieren – ist Mutex nicht frei, wird Fehlercode EBUSY zurückgegeben)
|
int pthread_mutex_unlock(
pthread_mutex_t *mutex);
|
gesperrten Mutex wieder freigeben
|
int pthread_mutex_destroy(
pthread_mutex_t *mutex);
|
Mutex löschen (freigeben)
|
B.12.5 Attribute von Mutexe
Tabelle B.65
Attribute für Mutexe setzen oder abfragen
Syntax
|
Bedeutung
|
int pthread_mutexattr_init(
pthread_mutexattr_t *attr);
|
Attributvariable für Mutexe initialisieren
|
int
pthread_mutexattr_setkind_np(
pthread_mutexattr_t *attr,
int kind );
|
Attribute für Mutex setzen
|
int
pthread_mutexattr_getkind_np(
pthread_mutexattr_t *attr,
int *kind );
|
Attribute für Mutex abfragen
|
int pthread_mutexattr_destroy(
pthread_mutexattr_t *attr);
|
Attributvariable für Mutex wieder freigeben
|
Hinweis Die Funktionen pthread_mutexattr_setkind_np() und pthread_mutexattr_getkind_np() sind keine portablen POSIX-Funktionen. Das gilt auch für die drei Attribute PTHREAD_MUTEX_FAST_NP, PTHREAD_MUTEX_ERRORCHECK_NP und PTHREAD_MUTEX_RECURSIVE_NP, von denen Linux offiziell nur PTHREAD_MUTEX_FAST_NP untersützt – obwohl auch diese Konstanten nicht portable sind (Endung _NP).
|
Alternativ gibt es noch die Funktionen
int pthread_mutexattr_settype (
pthread_mutexattr_t *attr, int kind );
int pthread_mutexattr_gettype (
const pthread_mutexattr_t *attr, int *kind );
welche zwar keine _np-Endung besitzten. Wobei sich dies allerdings wieder aufhebt, weil die Attribute (symbolische Konstanten) wieder dieselben möglichen sind, wie die schon eben erwähnten _NP-Konstanten.
B.12.6 Condition Variablen
Tabelle B.66
Funktionen für Condition Variablen
Syntax
|
Bedeutung
|
int pthread_cond_init(
pthread_cond_t *cond,
pthread_condattr_t *cond_attr);
|
Initialisieren einer Condition Variable
|
int pthread_cond_wait(
pthread_cond_t *cond,
pthread_mutex_t *mutex);
|
Wartet auf die Condition Variable
|
int pthread_cond_timewait(
pthread_cond_t *cond,
pthread_mutex_t *mutex,
const struct timespec *abstime);
|
Wartet eine bestimmte Zeit auf die Condition Variable
|
int pthread_cond_signal(
pthread_cond_t *cond);
|
Die Funktion weckt einen wartenden Thread auf. Bei mehreren wartenden Threads, liegt dies leider nicht in Ihrer Hand.
|
int pthread_cond_broadcast(
pthread_cond_t *cond);
|
Die Funktion weckt alle wartende Threads auf.
|
int pthread_cond_destroy(
pthread_cond_t *cond);
|
Freigeben einer Condition Variable
|
B.12.7 Threads beenden
Tabelle B.67
Erweiterte Möglichkeiten, einen Thread zu beenden
Syntax
|
Beschreibung
|
int pthread_cancel(
pthread_t thread);
|
Thread mit der ID thread beenden
|
int pthread_setcancelstate(
int state,
int *oldstate);
|
Hiermit lässt sich einstellen, ob sich der Thread mit pthread_cancel() aus einem zweiten Thread beenden lässt (Standardeinstellung (state=PTHREAD_CANCEL_ENABLE)) oder nicht (state=PTHREAD_CANCEL_DISABLE)
|
int pthread_setcanceltype(
int type,
int *oldtype);
|
Soll ein Thread sofort nach einem Aufruf von pthread_cancel() beendet werden muss hier für type PTHREAD_CANCEL_ASYNCHRONOUS angegeben werden. Ansonsten mit PTHREAD_CANCEL_DEFERRED (Standardeinstellung) läuft der Thread noch bis zum Ende bzw. nächsten Abbruchpunkt weiter.
|
|