pthread_create, Subroutine

Zweck

Erstellt einen neuen Thread, initialisiert seine Attribute und macht ihn ausführbar.

Bibliothek

Threadbibliothek (libpthreads.a)

Syntax

#include <pthread.h>

int pthread_create (thread, attr, start_routine (void *), arg)
pthread_t *thread;
const pthread_attr_t *attr;
void *(*start_routine) (void *);
void *arg;

Beschreibung

Die Subroutine pthread_create erstellt einen neuen Thread und initialisiert seine Attribute mithilfe des mit dem Parameter Attribut angegebenen Threadattributobjekts. Der neue Thread übernimmt die Signalmaske des erstellenden Threads. Alle anstehenden Signale des erstellenden Threads werden jedoch für den neuen Thread gelöscht.

Der neue Thread wird als ausführbar definiert und startet die Ausführung der Routine start_routine mit dem durch den Parameter arg angegebenen Parameter. Der Parameter arg ist ein leerer Zeiger; er kann auf jede Art von Daten verweisen. Es wird nicht empfohlen, diesen Zeiger in einen skalaren Datentyp umzusetzen (z. B.int ), da die Umsetzungen möglicherweise nicht portierbar sind.

Nach der Threaderstellung kann das Threadattributobjekt wiederverwendet werden, um einen weiteren Thread zu erstellen, oder gelöscht werden.

Der Thread wird in den folgenden Fällen beendet:

  • Der von seiner Startroutine zurückgegebene Thread (die main -Routine für den Anfangsthread)
  • Der Thread hat die Subroutine pthread_exit aufgerufen.
  • Der Thread wurde abgebrochen
  • Der Thread hat ein Signal empfangen, das ihn beendet hat.
  • Der gesamte Prozess wird aufgrund eines Aufrufs der Subroutinen exec oder exit beendet.
    Hinweis: Die Headerdatei pthread.h muss die erste eingeschlossene Datei jeder Quellendatei sein, die die Threadbibliothek verwendet. Andernfalls sollte das Kompilierungsflag -D_THREAD_SAFE oder der Compiler cc_r verwendet werden. In diesem Fall wird das Flag automatisch gesetzt.

Wenn in einem Prozess mehrere Threads erstellt werden, wird das Flag FULL_CORE für alle Signale gesetzt. Wenn also eine Kerndatei erzeugt wird, ist sie viel größer als eine Einzelthread-Anwendung. Dies ist für das Debugging von Prozessen mit mehreren Threads erforderlich.

Wenn ein Prozess die Funktion pthread_create verwendet und dadurch zu einem Multithread wird, wird für alle Signale das Flag FULL_CORE aktiviert. Wenn ein Signal empfangen wird, dessen Aktion darin besteht, den Prozess mit einem Kernspeicherauszug zu beenden, wird ein vollständiger Speicherauszug erstellt (normalerweise viel größer als ein regulärer Speicherauszug). Dies ist erforderlich, damit Multithread-Programme mit dem dbx -Befehl getestet werden können.

Der folgende Pseudocode ist ein Beispiel dafür, wie ein vollständiger Kern vermieden werden kann. Bitte beachten Sie, dass in diesem Fall kein Debugging möglich ist. Es kann einfacher sein, die Größe des Kerns mit dem Befehl ulimit zu beschränken.

struct sigaction siga;
siga.sa_handler = SIG_DFL;
siga.sa_flags = SA_RESTART;
SIGINITSET(siga.as_mask);
sigaction(<SIGNAL_NUMBER>, &siga, NULL);

Der alternative Stack wird nicht übernommen.

Parameter

Element Beschreibung
thread Verweist auf die Position, an der die Thread-ID gespeichert wird
attr Gibt das Threadattributobjekt an, das beim Erstellen des Threads verwendet wird Wenn der Wert NULList, werden die Standardattributwerte verwendet.
startroutine Verweist auf die Routine, die vom Thread ausgeführt werden soll
arg Verweist auf das einzelne Argument, das an die Routine start_routine übergeben werden soll

Rückgabewerte

Bei erfolgreicher Ausführung gibt die Funktion pthread_create null zurück. Andernfalls wird eine Fehlernummer zurückgegeben, die den Fehler angibt.

Fehlercodes

Die Funktion pthread_create schlägt fehl, wenn:

Element Beschreibung
EAGAIN Wenn WLM aktiv ist, wird der Grenzwert für die Anzahl der Threads in der Klasse erreicht.
EAGAIN Der Grenzwert für die Anzahl der Threads pro Prozess wurde erreicht.
EINVAL Der durch Attribut angegebene Wert ist ungültig.
EPERM Der Aufrufende verfügt nicht über die entsprechende Berechtigung zum Festlegen der erforderlichen Planungsparameter oder Planungsrichtlinie.

Die Funktion pthread_create gibt den Fehlercode EINTRnicht zurück.