quelle est la plage de valeurs de thread et id de processus?

fork et pthread_create un identifiant de processus ou un identifiant de thread.

Mais je ne connais pas la plage de valeur de ces identifiants.

Maintenant, je veux faire une table de recherche, dans chaque entrée il y a un élément / champ pour l’identifiant de thread. la structure de chaque entrée est la suivante:

  typedef struct { int seq; pthread_t tid; ... } entry_t; 

Je veux assigner une valeur à un tid invalide à une entrée quand je ne reçois pas le tid d’un thread (bientôt ce champ sera rempli avec un valide, mais avant cela la fonction de fill vérifiera si le pid est valide ou ne pas). alors, quelle est la plage de valeurs de thread et id de processus?

Le type pthread_t est complètement opaque. Vous ne pouvez la comparer que pour l’égalité avec la fonction pthread_equal , et il n’y a pas de valeur réservée distincte de tout identifiant de thread valide, bien qu’une telle valeur soit probablement ajoutée à la prochaine version du standard POSIX. En tant que tel, vous aurez besoin de stocker un second champ à côté de l’identifiant de thread pour savoir s’il est valide ou non.

La valeur maximale de pid est modifiable. Par défaut, elle est 32768, ce qui correspond à la taille de la valeur maximale de short int.And, elle peut être compatible avec UNIX de la première version.

Vous pouvez le voir et le changer dans / proc / sys / kernel / pid_max.

BTW ,

L’ID de processus 0 est généralement le processus du planificateur et est souvent appelé le swapper. Aucun programme sur disque ne correspond à ce processus, qui fait partie du kernel et est appelé processus système. L’ID de processus 1 est généralement le processus init et est appelé par le kernel à la fin de la procédure d’amorçage. Le fichier programme pour ce processus était / etc / init dans les versions antérieures du système UNIX et / sbin / init dans les versions plus récentes. Ce processus est responsable de la mise en place d’un système UNIX après l’amorçage du kernel. –APUE

Le TID n’a de signification que dans le contexte du processus auquel il appartient. Dans différentes familles d’UNIX, pthread_t n’est pas du même type, tel que

Linux 2.4.22 utilise un entier long non signé pour le type de données pthread_t. Solaris 9 représente le type de données pthread_t sous la forme d’un entier non signé. FreeBSD 5.2.1 et Mac OS X 10.3 utilisent un pointeur sur la structure pthread pour le type de données pthread_t. –APUE

Donc, vous ne pouvez pas simplement dire sa scope.

Mais threads_max présente le nombre de threads maximum dans un processus. Vous pouvez le voir et le modifier dans / proc / sys / kernel / threads-max.

Comme d’autres l’ont souligné, aucune valeur n’indique un pthread-id non valide.

Une approche pour contourner ce problème pourrait consister à modifier votre structure en décrivant un thread comme ceci:

 typedef struct { int seq; pthread_t pthread; int pthread_is_valid; /* set this to 0 on initialisation of the structure and change it be 1 if pthread_create() was successfull. */ ... } entry_t; 

Aussi, je recommande de ne pas appeler la valeur définie par le premier paramètre tid de pthread_create() , car cette cause donne un nom ambigu avec ce qui est réaccordé par gettid() , qui sous Linux est en fait un identifiant de processus.


Comme id processus invalide -1 devrait faire.

À mon avis, pourquoi ne pouvez-vous pas suivre un identifiant de fil invalide en affectant une valeur d’erreur définie au tid lui-même? Lorsque vous créez une table de consultation, la taille peut être contrainte si vous continuez à append davantage de membres à structurer lorsque la table s’agrandit.

/ * Identificateurs de threads * / typedef unsigned long int pthread_t;

Lors de la vérification du résultat de pthread_create, vous affectez probablement votre propre valeur d’erreur définie.

Ex: pthread_create fail – assigne une valeur de -ve à tid. Ainsi, lors de la recherche, vous pouvez valider la vérification de votre propre valeur #define -ve.