was ist der Wertebereich der thread und Prozess-id?
fork
und pthread_create
gibt eine Prozess-id oder thread-id.
Aber ich weiß nicht, der Wertebereich dieser ids.
Nun möchte ich eine lookup-Tabelle, in der jedem Eintrag gibt es ein Element/Feld für die thread-id.
die Struktur jeder Eintrag ist wie:
typedef struct {
int seq;
pthread_t tid;
...
} entry_t;
Möchte ich einen Wert zuweisen, der auf eine ungültige tid
zu einem Eintrag, wenn ich nicht bekommen, die tid von einem thread(bald ist dieses Feld gefüllt mit einer gültigen, aber vor, dass die fill
Funktion wird geprüft, ob die pid ist gültig oder nicht). also, was ist der Wertebereich der thread und Prozess-id?
pthread_create()
gibt 0 oder einen Fehler-Nummer; es wird derpthread_t
Struktur übergeben wird, in der es über einen Zeiger, aber es gibt keine dokumentierte Struktur für diepthread_t
geben. Die PIDs zurückgegebenfork()
sind Varianten auf dem Themaint
; Sie sind 32-bit-zahlen, die zwar alle 32-bits werden nur selten verwendet (aber mehr als 16 bit verwendet werden). Linux hat einegettid()
- Funktion zur Rückgabe eines thread-ID; der Rückgabetyp istpid_t
, das gleiche wiefork()
undgetpid()
. Es ist nicht eine standard-Funktion (und wurde Hinzugefügt, in-kernel 2.4.11 nach den docs bin ich auf der Suche an).- ist es möglich, dass
tid
= 0? - Bitte beachten Sie, dass der zurückgegebene Wert von
gettid()
(tid) hat nichts zu tun mit dem Wert des ersten Parameters durch einen erfolgreichen Aufruf vonpthread_create()
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
pthread_t
Typ ist völlig undurchsichtig. Man kann nur vergleichen Sie es für die Gleichstellung mit derpthread_equal
Funktion, und es gibt keine reservierten Wert unterscheidet sich von allen gültigen thread-id, wenn ein solcher Wert wird wahrscheinlich Hinzugefügt werden, um die nächste version des POSIX-Standards. Als solche müssen Sie zum speichern einer zweiten Feld neben der thread-id, um nachzuverfolgen, ob es gültig ist oder nicht.pthread_t
ist nicht angegeben zu werden, die einen skalaren Typ. Es könnte sein, eine Struktur oder union. Die reservierten vorgeschlagene Wert für neben POSIX-wäre eine undurchsichtige makro nur verwendet werden für die Zuordnung und Weitergabe anpthread_equal
.0
im Feld, und dann ist es wirklich eine gültige tid = 0, dann gibt es einen Konflikt. Weil ich einen timeout, wenn das timeout erreicht ist, werde ich beurteilen, ob die tid ist immer noch 0, wenn es ist, werde ich es löschen. Aber wenn es wirklich eine gültigetid=0
, dann meine Löschung ist falsch!pthread_kill(tid, 0)
zur überprüfung der Gültigkeit der tid-Wert?pthread_kill
ruft zu undefiniertem Verhalten. Wenn Sie Glück haben, stürzt Ihre Anwendung. Wenn du Pech hast, kann es Ihnen die falsche Antwort, oder noch schlimmer.Den max-Wert von pid ist wechselhaft, im Standard ist 32768, das ist die Größe der max-Wert der short-int.Und, kann es kompatibel mit UNIX frühe version.
Können Sie sehen und ändern Sie es in /proc/sys/kernel/pid_max.
BTW,
Die tid hat eine Bedeutung nur im Kontext des Prozesses, zu dem es gehört.
In verschiedenen famlies von UNIX, die pthread_t ist nicht die gleiche Art,wie
Also kann man nicht einfach sagen Ihren Anwendungsbereich .
Aber threads_max stellt dar, wie viele threads in einem Prozess auf die meisten,können Sie sehen und ändern Sie es in /proc/sys/kernel/threads-max.
/proc/sys/kernel/threads-max
nichtthread_max
tid=0
...Als andere wies darauf hin, es ist kein Wert definiert, der angibt, eine ungültige pthread-id.
Ein Ansatz, dies zu umgehen, könnte die mod ist Ihre Struktur, die beschreibt, einen thread wie so:
Auch empfehle ich nicht nennen, der Wert von
pthread_create()
's erste parametertid
als Ursache dieser name ambiguousness mit dem, was ist, umgestimmt durchgettid()
, die unter Linux ist eigentlich eine Prozess-id.Als ungültige Prozess-id
-1
tun sollte.Meine Meinung, warum kannst du nicht verfolgen, ungültige thread-id durch zuweisen von definierten Fehlerwert zu tid selbst. Wie Sie Sie machen look-up-Tabelle, die Größe-Einschränkung, wenn Sie halten das hinzufügen mehr Mitglieder zu struct, wenn die Tabelle wächst.
/* Thread Identifier */
typedef unsigned long int pthread_t;
Während der Prüfung pthread_create Ergebnis, wahrscheinlich ordnen Sie Ihre eigenen definierten Fehlerwert .
Ex:
pthread_create fail - weisen sagen -ve Wert zu tid . so, während lookup können Sie überprüfen, überprüfung Ihrer eigenen #define -ve-Wert.