Threadbibliotheksoptionen

In diesem Abschnitt werden spezielle Attribute von Threads, Mutexen und Bedingungsvariablen beschrieben.

Der POSIX -Standard für die Threadbibliothek gibt die Implementierung einiger Komponenten als optional an. Alle Subroutinen, die von der API der Threadbibliothek definiert werden, sind immer verfügbar. Abhängig von den verfügbaren Optionen sind einige Subroutinen möglicherweise nicht implementiert. Nicht implementierte Subroutinen können von Anwendungen aufgerufen werden, aber sie geben stets den Fehlercode ENOSYS zurück.

Stack-Attribute

Jedem Thread wird ein Stack zugeordnet. Das Stack-Management ist implementierungsabhängig. Die folgenden Informationen gelten daher nur für AIX®, obwohl ähnliche Funktionen auch auf anderen Systemen vorhanden sein können.

Der Stack wird dynamisch zugeordnet, wenn der Thread erstellt wird. Mithilfe erweiterter Threadattribute kann der Benutzer die Stackgröße und -adresse des Stacks steuern. Die folgenden Informationen gelten nicht für den vom System erstellten Anfangsthread.

Stack-Größe

Die Option für die Stackgröße aktiviert die Steuerung des Attributs stacksize eines Threadattributobjekts. Dieses Attribut gibt die für den erstellten Thread zu verwendende Mindeststackgröße an.

Das Attribut stacksize wird in AIXdefiniert. Die folgenden Attribute und Subroutinen sind verfügbar, wenn die Option implementiert wird:

Der Standardwert des Attributs stacksize ist 96 KB. Der Mindestwert für das Attribut stacksize ist 16 KB. Wenn der zugeordnete Wert kleiner als der Mindestwert ist, wird der Mindestwert zugeordnet.

In der AIX -Implementierung der Threadbibliothek wird jedem erstellten Thread ein Datenblock mit dem Namen Benutzerthreadbereichzugeordnet. Der Bereich ist in die folgenden Abschnitte unterteilt:
  • Eine rote Zone, die sowohl schreibgeschützt als auch schreibgeschützt ist, um einen Stacküberlauf zu erkennen. In Programmen, die große Seiten verwenden, gibt es keine rote Zone.
  • Ein Standardstack.
  • Eine pthread-Struktur
  • Eine Threadstruktur.
  • Eine Threadattributstruktur.
Hinweis: Der hier beschriebene Benutzerthreadbereich hat keine Beziehung zur Struktur uthread , die im AIX -Kernel verwendet wird. Auf den Benutzerthreadbereich wird nur im Benutzermodus zugegriffen und er wird ausschließlich von der Threadbibliothek verarbeitet, während die Struktur uthread nur in der Kernelumgebung vorhanden ist.

Option POSIX für Stackadresse

Die Option für Stackadressen aktiviert die Steuerung des Attributs stackaddr eines Threadattributobjekts. Dieses Attribut gibt die Position des Speichers an, der für den erstellten Thread-Stack verwendet wird.

Die folgenden Attribute und Subroutinen sind verfügbar, wenn die Option implementiert wird:
  • Das Attribut stackaddr des Threadattributobjekts gibt die Adresse des Stacks an, der einem Thread zugeordnet wird.
  • Die Subroutine pthread_attr_getstackaddr gibt den Wert des Attributs zurück.
  • und Subroutine pthread_attr_setstackaddr legt den Wert fest.

Wenn keine Stackadresse angegeben ist, wird der Stack vom System an einer beliebigen Adresse zugeordnet. Wenn der Stack an einer bekannten Position sein muss, können Sie das Attribut stackaddr verwenden. Wenn Sie beispielsweise einen sehr großen Stack benötigen, können Sie als Adresse ein nicht verwendetes Segment festlegen, um sicherzustellen, dass die Zuordnung erfolgreich ist.

Wenn beim Aufruf der Subroutine pthread_create eine Stackadresse angegeben wird, versucht das System, den Stack an der angegebenen Adresse zuzuordnen. Wenn sie fehlschlägt, gibt die Subroutine pthread_create EINVALzurück. Da die Subroutine pthread_attr_setstackaddr den Stack nicht tatsächlich zuordnet, gibt sie nur einen Fehler zurück, wenn die angegebene Stackadresse den Adressierungsbereich überschreitet.

Option POSIX für Prioritätszeitplanung

Die Option für die Prioritätsplanung ermöglicht die Steuerung der Ausführungsplanung auf Threadebene. Wenn diese Option inaktiviert ist, nutzen alle Threads innerhalb eines Prozesses die Planungseigenschaften des Prozesses gemeinsam. Wenn diese Option aktiviert ist, hat jeder Thread seine eigenen Planungseigenschaften. Bei Threads im Bereich lokaler Konkurrenzsituationen werden die Planungseigenschaften auf Prozessebene von einem Bibliotheks-Scheduler verarbeitet, während bei Threads im Bereich globaler Konkurrenzsituationen die Planungseigenschaften auf Systemebene vom Kernel-Scheduler verarbeitet werden.

Die folgenden Attribute und Subroutinen sind verfügbar, wenn die Option implementiert wird:

  • Das Attribut inheritsched des Threadattributobjekts
  • Das Attribut schedparam des Threadattributobjekts und des Threads
  • Das Attribut schedpolicy der Threadattributobjekte und des Threads
  • Das Attribut contention-scope der Threadattributobjekte und des Threads
  • Die Subroutinen pthread_attr_getschedparam und pthread_attr_setschedparam
  • Die Subroutine pthread_getschedparam

Verfügbarkeit einer Option überprüfen

Optionen können zur Kompilierzeit oder zur Laufzeit geprüft werden. Portierbare Programme sollten die Verfügbarkeit von Optionen prüfen, bevor sie verwendet werden, damit sie nicht neu geschrieben werden müssen, wenn sie auf andere Systeme portiert werden.

Kompilierzeitprüfung

Wenn eine Option nicht verfügbar ist, können Sie die Kompilierung stoppen, wie im folgenden Beispiel gezeigt:
#ifndef _POSIX_THREAD_ATTR_STACKSIZE
#error "The stack size POSIX option is required"
#endif
Die Headerdatei pthread.h definiert auch die folgenden Symbole, die von anderen Headerdateien oder Programmen verwendet werden können:
_POSIX_REENTRANT_FUNKTIONEN
Gibt an, dass wiedereintrittsfähige Funktionen erforderlich sind.
_POSIX_THREADS
Bezeichnet die Implementierung der Threadbibliothek

Laufzeitüberprüfung

Die Subroutine sysconf kann verwendet werden, um die Verfügbarkeit von Optionen auf dem System abzurufen, auf dem das Programm ausgeführt wird. Dies ist nützlich, wenn Sie Programme zwischen Systemen mit Binärkompatibilität portieren, z. B. zwei Versionen von AIX.

Die folgende Liste enthält die Symbole, die jeder Option zugeordnet sind und für den Parameter Name der Subroutine sysconf verwendet werden müssen. Die symbolischen Konstanten sind in der Headerdatei unistd.h definiert.

Stackadresse
_SC_THREAD_ATTR_STACKADDR
Stack-Größe
_SC_THREAD_ATTR_STACKSIZE
Prioritätsplanung
_SC_THREAD_PRIORITY_SCHEDULING
Prioritätsvererbung
_SC_THREAD_PRIO_INHERIT
Prioritätsschutz
_SC_THREAD_PRIO_PROTECT
Gemeinsame Nutzung von Prozessen
_SC_THREAD_PROCESS_SHARED
Um die allgemeinen Optionen zu überprüfen, verwenden Sie die Subroutine sysconf mit den folgenden Werten für den Parameter Name :
_SC_WIEDEREINTRITTSFÄHIGE Funktionen
Gibt an, dass wiedereintrittsfähige Funktionen erforderlich sind.
_SC_THREADS
Bezeichnet die Implementierung der Threadbibliothek.

Gemeinsame Nutzung von Prozessen

AIX und die meisten ' UNIX -Systeme erlauben es mehreren Prozessen, sich einen gemeinsamen Datenraum, bekannt als ' gemeinsamer Speicher, zu teilen. Die prozessübergreifenden Attribute für Zustandsvariablen und Mutexe sollen es ermöglichen, diese Objekte im gemeinsamen Speicher zuzuweisen, um die Synchronisation zwischen Threads, die zu verschiedenen Prozessen gehören, zu unterstützen. Da es jedoch keine standardisierte Schnittstelle für die Verwaltung des gemeinsam genutzten Speichers gibt, ist die Option POSIX für die gemeinsame Prozessnutzung nicht in der AIX -Threadbibliothek implementiert.

Threaddatentypen

Die folgenden Datentypen sind für die Threadbibliothek definiert: Die Definition dieser Datentypen kann je nach System variieren:
PTHREAD_T
Bezeichnet einen Thread
pthread_attr_t
Gibt ein Threadattributobjekt an
pthread_cond_t
Bezeichnet eine Bedingungsvariable
pthread_condattr_t
Gibt ein Bedingungsattributobjekt an
pthread_schlüssel_t
Gibt einen threadspezifischen Datenschlüssel an
pthread_mutex_t
Bezeichnet einen Mutex
pthread_mutexattr_t
Gibt ein Mutex-Attributobjekt an
pthread_once_t
Gibt ein einmaliges Initialisierungsobjekt an

Grenzwerte und Standardwerte

Die Threadbibliothek hat einige implementierungsabhängige Grenzwerte und Standardwerte. Diese Grenzwerte und Standardwerte können durch symbolische Konstanten abgerufen werden, um die Portierbarkeit von Programmen zu verbessern:
  • Die maximale Anzahl Threads pro Prozess ist 512. Die maximale Anzahl an Threads kann zur Kompilierzeit mit der symbolischen Konstante PTHREAD_THREADS_MAX abgerufen werden, die in der Headerdatei pthread.h definiert ist. Wenn eine Anwendung mit dem Flag -D_LARGE_THREADS kompiliert wird, beträgt die maximale Anzahl Threads pro Prozess 32767.
  • Die Mindeststackgröße für einen Thread beträgt 8 K. Die Standardstackgröße ist 96 KB. Diese Anzahl kann bei der Kompilierung mithilfe der symbolischen Konstante PTHREAD_STACK_MIN abgerufen werden, die in der Headerdatei pthread.h definiert ist.
    Hinweis Die maximale Stackgröße beträgt 256 MB, die Größe eines Segments. Dieser Grenzwert wird durch die symbolische Konstante PTHREAD_STACK_MAX in der Headerdatei pthread.h angegeben.
  • Die maximale Anzahl threadspezifischer Datenschlüssel ist auf 508 begrenzt. Diese Anzahl kann während der Kompilierung mithilfe der symbolischen Konstante PTHREAD_KEYS_MAX abgerufen werden, die in der Headerdatei pthread.h definiert ist.

Standardattributwerte

Die Standardwerte für das Threadattributobjekt werden in der Headerdatei pthread.h durch die folgenden symbolischen Konstanten definiert:
  • Der Standardwert für die symbolische Konstante DEFAULT_DETACHSTATE ist PTHREAD_CREATE_DETACHED. Dies gibt den Standardwert des Attributs detachstate an.
  • Der Standardwert für die symbolische Konstante DEFAULT_JOINABLE ist PTHREAD_CREATE_JOINABLE, der den Standardwert für den Status 'joinable' angibt.
  • Der Standardwert für die symbolische Konstante DEFAULT_INHERIT ist PTHREAD_INHERIT_SCHED. Dies ist der Standardwert für das Attribut inheritsched .
  • Der Standardwert für die symbolische Konstante DEFAULT_PRIO ist 1. Dies gibt den Standardwert für diesched_prioFeld des Attributs schedparam .
  • Der Standardwert für die symbolische Konstante DEFAULT_SCHED ist SCHED_OTHER. Dies gibt den Standardwert für das Attribut schedpolicy eines Threadattributobjekts an.
  • Der Standardwert für die symbolische Konstante DEFAULT_SCOPE ist PTHREAD_SCOPE_LOCAL, was den Standardwert für das Attribut contention-scope angibt.