pthread_create(3-thr) pthread_create(3-thr)
NAME
pthreadcreate - Thread-Objekt und Thread erstellen
SYNTAX
#include <pthread.h>
int pthreadcreate(
pthreadt *thread,
pthreadattrt attr,
pthreadstartroutinet startroutine,
pthreadaddrt arg);
PARAMETER
thread Zeiger (Handle) auf den zu erstellenden Thread.
attr Das Objekt für Thread-Attribute, das die Merkmale des
zu erstellenden Thread definiert. Wenn Sie
pthreadattrdefault angeben, werden die Standardattri-
bute verwendet.
startroutine Die Funktion, die als Startroutine des neuen Thread
ausgeführt wird.
arg Der Adreßwert, der kopiert und an die Startroutine des
Thread übergeben wird.
BESCHREIBUNG
Die Routine pthreadcreate() erstellt ein Thread-Objekt und einen
Thread. Ein Thread ist ein einfacher, nacheinander ablaufender Steuer-
fluß innerhalb eines Programms. Hierbei handelt es sich um die aktive
Ausführung einer angegebenen Routine einschließlich aller verschach-
telter Aufrufe von Routinen. Ein Thread-Objekt definiert und steuert
den ausführenden Thread.
Erstellen eines Thread
Bei Aufruf dieser Routine werden folgende Aktionen in Gang gesetzt:
- Ein internes Thread-Objekt wird zur Beschreibung des Thread
erstellt.
- Der zugehörige ausführbare Thread wird mit den über den Parameter
attr angegebenen Attributen (oder mit Standardattributen, wenn
pthreadattrdefault angegeben ist) erstellt.
- Der Parameter thread erhält den neuen Thread.
- Die Funktion startroutine wird aufgerufen. Dies kann eintreten
noch bevor diese Routine erfolgreich beendet worden ist.
Seite 1 Reliant UNIX 5.44 Gedruckt 11/98
pthread_create(3-thr) pthread_create(3-thr)
Thread-Ausführung
Der Thread wird im Bereit-Status erstellt und kann daher sofort damit
beginnen, die über den Parameter startroutine angegebene Funktion
auszuführen. Wenn für den neu erstellten Thread die Scheduling-Strate-
gie SCHEDRR oder SCHEDFIFO definiert ist, und/oder wenn er eine
höhere Priorität als die des erstellenden Thread aufweist, wird der
neue Thread bereits ausgeführt, bevor pthreadcreate() beendet ist.
Andernfalls beginnt der neue Thread mit der Ausführung, wenn er an der
Reihe ist, was auch bereits vor der Rückkehr von pthreadcreate() ein-
treten kann, wenn genügend Prozessoren verfügbar sind.
Der Parameter startroutine erhält eine Kopie des Parameters arg. Der
Wert des Parameters arg ist nicht angegeben.
Das Thread-Objekt existiert so lange, bis entweder die Routine
pthreaddetach() aufgerufen oder der Thread beendet wird, je nachdem,
was zuletzt eintritt.
Die Synchronisation zwischen dem Aufrufer von pthreadcreate() und dem
neu erstellten Thread erfolgt über die Routine pthreadjoin() (oder
andere Mutexe oder Condition-Variablen, auf deren Verwendung sich
beide geeinigt haben).
Beenden eines Thread
Ein Thread wird beendet, wenn eines der folgenden Ereignisse eintritt:
- Der Thread kehrt von der Startroutine zurück.
- Der Thread wird (innerhalb einer Routine) aufgrund eines Aufrufs
der Routine pthreadexit() beendet.
- Der Thread wird abgebrochen.
Bei Beendigung eines Thread
Die folgenden Aktionen werden ausgeführt, wenn ein Thread beendet
wird:
- Wird der Thread beendet, weil er von der Startroutine zurückkehrt
oder pthreadexit() aufgerufen wird, wird der Rückgabewert in das
Thread-Objekt kopiert. Kehrt die Startroutine normal zurück, und
handelt es sich bei der Startroutine um eine Prozedur, die keinen
Wert zurückgibt, ist das Ergebnis von pthreadjoin() unvorherseh-
bar. Wurde der Thread abgebrochen wird der Rückgabewert -1 in das
Thread-Objekt kopiert. Der Rückgabewert kann von anderen Threads
durch einen Aufruf der Routine pthreadjoin() abgerufen werden.
- Ein Destruktor für jeden thread-spezifischen Datenpunkt wird aus
der Liste der Destruktoren für diesen Thread entfernt und dann auf-
gerufen. Durch diesen Schritt werden alle thread-spezifischen Daten
zum aktuellen Thread zerstört.
Seite 2 Reliant UNIX 5.44 Gedruckt 11/98
pthread_create(3-thr) pthread_create(3-thr)
- Jede Bereinigungsroutine, die von pthreadcleanuppush() deklariert
wurde und bisher noch nicht von pthreadcleanuppop() entfernt wor-
den ist, wird aufgerufen. Die zuletzt eingespeicherte Bereinigungs-
routine wird dabei zuerst aufgerufen.
- Im Thread-Objekt wird ein Flag gesetzt, das anzeigt, daß der Thread
beendet wurde. Dieses Flag muß gesetzt werden, damit Aufrufer von
pthreadjoin() vom Aufruf zurückkehren können.
- Es erfolgt ein Broadcast, so daß alle derzeit in einem Aufruf von
pthreadjoin() wartenden Threads vom Aufruf zurückkehren können.
- Das Thread-Objekt wird markiert, um anzuzeigen, daß es vom Thread
nicht mehr benötigt wird. Es wird überprüft, ob das Thread-Objekt
auch von anderen Threads nicht mehr benötigt wird (falls die Rou-
tine pthreaddetach() aufgerufen wurde). Wenn diese Routine aufge-
rufen wird, wird die Zuordnung des Thread-Objekts aufgehoben.
RÜCKGABEWERTE
Nach erfolgreicher Ausführung speichert diese Routine die ID des
erstellten Thread unter thread und gibt den Wert 0 zurück. Andernfalls
wird der Wert -1 zurückgegeben und kein Thread erstellt, der Inhalt
von thread wird nicht definiert, und errno kann auf einen der folgen-
den Werte gesetzt werden:
EAGAIN Das System verfügt nicht über die erforderlichen Ressourcen
zur Erstellung eines weiteren Thread.
ENOMEM Der Speicher reicht zur Erstellung des Thread-Objekts nicht
aus. Dies ist keine temporäre Bedingung.
SIEHE AUCH
pthreadattrcreate(3-thr), pthreadcancel(3-thr),
pthreaddetach(3-thr), pthreadexit(3-thr), pthreadjoin(3-thr).
Seite 3 Reliant UNIX 5.44 Gedruckt 11/98