2010-10-23 28 views
1

Est-ce que quelqu'un sait pour obtenir l'ID de thread en cours en tant qu'entier sur BSD?comment obtenir l'ID de thread en tant qu'entier sur BSD en C/C++?

J'ai trouvé ce

#ifdef RTHREADS 
    299  STD  { pid_t sys_getthrid(void); } 
    300  STD  { int sys_thrsleep(void *ident, int timeout, void *lock); } 
    301  STD  { int sys_thrwakeup(void *ident, int n); } 
    302  STD  { int sys_threxit(int rval); } 
    303  STD  { int sys_thrsigdivert(sigset_t sigmask); } 
#else 
    299  UNIMPL 
    300  UNIMPL 
    301  UNIMPL 
    302  UNIMPL 
    303  UNIMPL 
#endif 

et essayé (long) syscall (229), mais ne fonctionne pas (il se bloque). Sur Linux, je peux obtenir un ID de thread avec system call (long) syscall (224) qui me donne un entier (généralement 4 chiffres). Quelqu'un peut-il aider ?! Je vous remercie.

Répondre

4

Il n'existe pas de "BSD". Chaque système * BSD est complètement différent, surtout quand il s'agit de threads. Même au sein d'un projet unique comme FreeBSD, il existe diverses implémentations pthread (libc_r, kse, thr) qui varient entre les versions os et la configuration de l'utilisateur.

Cela dit, sur FreeBSD-8 il devrait y avoir int thr_self(long *id) dans /usr/include/sys/thr.h et il est NetBSD raisonnablement frais lwpid_t _lwp_self(void) dans /usr/include/lwp.h.

Pour plus de plates-formes, vous pouvez jeter un oeil à int get_unix_tid(void) dans la source de vin.

+0

c'est nouveau pour moi. bonne info! merci beaucoup, bravo! – Lini

+0

Sur FreeBSD, il y a aussi la fonction pthread_getthreadid_np(): https://www.freebsd.org/cgi/man.cgi?pthread_getthreadid_np –

0

Déterminez quels < sys/types.h> pourraient être inclus dans vos unités de traduction C (en vérifiant avec vous les chemins d'accès). pid_t y est défini. C'est un type intégral signé, mais il y en a quelques-uns. Il pourrait facilement être plus large qu'un long.

The Open Groups documentation des sys/types.h promet « La mise en œuvre doit prendre en charge un ou plusieurs environnements de programmation où les largeurs de blksize_t, pid_t, size_t, ssize_t, suseconds_t et useconds_t ne sont plus que la largeur de type long. La les noms de ces environnements de programmation peuvent être obtenus en utilisant la fonction confstr() ou l'utilitaire getconf. " Donc, vous pouvez probablement lancer un pid_t à long (ou au moins utiliser getconf pour savoir ce que vous devez faire pour être dans une situation où pid_t peut être lancé en toute sécurité). Voir C Language Gotchas: printf format strings pour une discussion sur la raison pour laquelle ce que vous voulez faire est compliqué, ne peut pas être écrit de façon portable et peut soudainement se casser dans le futur.