Provided by: manpages-fr_4.21.0-2_all bug

NOM

       pthreads – Threads POSIX

DESCRIPTION

       POSIX.1  décrit  une  série  d'interfaces  (fonctions  et  fichiers  d'en‐têtes)  pour  la
       programmation multithread, couramment  appelée  threads  POSIX,  ou  pthreads.  Un  unique
       processus  peut  contenir  plusieurs  threads,  qui  exécutent tous le même programme. Ces
       threads partagent la même mémoire globale (segments de données et tas), mais chaque thread
       a sa propre pile (variables automatiques).

       POSIX.1  requiert  aussi  que  les  threads  partagent  une  série d'autres attributs (ces
       attributs sont par processus, plutôt que par thread) :

       -  identifiant de processus (PID)

       -  identifiant de processus parent (PPID)

       -  identifiant de groupe de processus (PGID) et identifiant de session (SID)

       -  terminal de contrôle

       -  identifiants d'utilisateur et de groupe

       -  descripteurs de fichier ouverts

       -  verrouillages d'enregistrements (consultez fcntl(2))

       -  gestion de signaux

       -  masque de création de mode de fichier (umask(2))

       -  répertoire de travail (chdir(2)) et répertoire racine (chroot(2))

       -  temporisations d'intervalle (setitimer(2)) et temporisations POSIX (timer_create(2))

       -  valeur de politesse (setpriority(2))

       -  limites de ressources (setrlimit(2))

       -  mesures de consommation de temps CPU (times(2)) et de ressources (getrusage(2))

       En plus de la pile, POSIX.1 indique que plusieurs autres  attributs  sont  distincts  pour
       chaque thread, dont les suivants :

       -  identifiant de thread (le type de donnée pthread_t)

       -  masque de signaux (pthread_sigmask(3))

       -  la variable errno

       -  pile de signaux spécifique (sigaltstack(2))

       -  politique et priorité d'ordonnancement temps réel (sched(7))

       Les  caractéristiques  spécifiques à Linux suivantes sont également distinctes pour chaque
       thread :

       -  capacités (consultez capabilities(7))

       -  affinité CPU (sched_setaffinity(2))

   Valeurs de retour des fonctions pthreads
       La plupart des fonctions pthreads renvoient ̣0 en cas de succès et un numéro  d'erreur  en
       cas d'échec. Les numéros d’erreur pouvant être renvoyés ont la même signification que ceux
       renvoyés dans errno  par  les  appels  système  conventionnels  et  les  fonctions  de  la
       bibliothèque C.  Notez  que les fonctions pthreads ne positionnent pas errno. Pour chacune
       des fonctions pthreads qui peuvent produire  une  erreur,  POSIX.1-2001  spécifie  que  la
       fonction ne peut pas échouer avec l'erreur EINTR.

   Identifiants de thread
       Chacun  des  threads d'un processus a un unique identifiant de thread (stocké dans le type
       pthread_t). Cet identifiant est renvoyé à l'appelant de  pthread_create(3)  et  un  thread
       peut obtenir son propre identifiant de thread en utilisant pthread_self(3).

       Les  identifiants  de  threads  ne  sont  garantis  d'être  uniques  qu'à l'intérieur d'un
       processus. Dans toutes les fonctions pthreads qui acceptent un identifiant de thread comme
       argument,  par  définition,  cet  identifiant  fait  référence  à  un  thread dans le même
       processus que celui de l’appelant.

       Le système peut réutiliser un identifiant de thread après qu'un thread qui s'est terminé a
       été  rejoint ou qu'un thread détaché se soit terminé. POSIX précise : « Si une application
       essaie d’utiliser un identifiant  de  thread  dont  la  durée  de  vie  est  dépassée,  le
       comportement est indéfini. ».

   Fonctions sûres du point de vue des threads
       Une  fonction  sûre  du point de vue des threads est une fonction qui peut être appelée en
       toute sûreté (c'est-à-dire qu'elle renverra le même résultat d'où  qu'elle  soit  appelée)
       par plusieurs threads en même temps.

       POSIX.1-2001  et  POSIX.1-2008  exigent  que  toutes les fonctions indiquées dans la norme
       soient sûres du point de vue des threads, exceptées les fonctions suivantes :

           asctime()
           basename()
           catgets()
           crypt()
           ctermid() avec un paramètre non NULL
           ctime()
           dbm_clearerr()
           dbm_close()
           dbm_delete()
           dbm_error()
           dbm_fetch()
           dbm_firstkey()
           dbm_nextkey()
           dbm_open()
           dbm_store()
           dirname()
           dlerror()
           drand48()
           ecvt() [POSIX.1-2001 uniquement (fonction supprimée dans POSIX.1-2008)]
           encrypt()
           endgrent()
           endpwent()
           endutxent()
           fcvt() [POSIX.1-2001 uniquement (fonction supprimée dans POSIX.1-2008)]
           ftw()
           gcvt() [POSIX.1-2001 uniquement (fonction supprimée dans POSIX.1-2008)]
           getc_unlocked()
           getchar_unlocked()
           getdate()
           getenv()
           getgrent()
           getgrgid()
           getgrnam()
           gethostbyaddr() [POSIX.1-2001 uniquement (fonction supprimée dans
                            POSIX.1-2008)]
           gethostbyname() [POSIX.1-2001 uniquement (fonction supprimée dans
                            POSIX.1-2008)]
           gethostent()
           getlogin()
           getnetbyaddr()
           getnetbyname()
           getnetent()
           getopt()
           getprotobyname()
           getprotobynumber()
           getprotoent()
           getpwent()
           getpwnam()
           getpwuid()
           getservbyname()
           getservbyport()
           getservent()
           getutxent()
           getutxid()
           getutxline()
           gmtime()
           hcreate()
           hdestroy()
           hsearch()
           inet_ntoa()
           l64a()
           lgamma()
           lgammaf()
           lgammal()
           localeconv()
           localtime()
           lrand48()
           mrand48()
           nftw()
           nl_langinfo()
           ptsname()
           putc_unlocked()
           putchar_unlocked()
           putenv()
           pututxline()
           rand()
           readdir()
           setenv()
           setgrent()
           setkey()
           setpwent()
           setutxent()
           strerror()
           strsignal() [Ajoutée dans POSIX.1-2008]
           strtok()
           system() [Ajoutée dans POSIX.1-2008]
           tmpnam() avec un paramètre non NULL
           ttyname()
           unsetenv()
           wcrtomb() si son dernier paramètre est NULL
           wcsrtombs() si son dernier paramètre est NULL
           wcstombs()
           wctomb()

   Fonctions pour annulations sûres asynchrones
       Une fonction pour annulations sûres asynchrones peut être appelée  sans  risque  dans  une
       application où l’annulation asynchrone est activée (consultez pthread_setcancelstate(3)).

       POSIX.1-2001  et  POSIX.1-2008  exigent  que  seules  les  fonctions suivantes soient pour
       annulations sûres asynchrones :

           pthread_cancel()
           pthread_setcancelstate()
           pthread_setcanceltype()

   Points d'annulation
       POSIX.1 spécifie que certaines fonctions doivent, et certaines autres  fonctions  peuvent,
       être  des  points  d'annulation. Si un thread est annulable, que son type d'annulation est
       différé (« deferred ») et qu'une demande d'annulation est en cours pour ce  thread,  alors
       le thread est annulé quand il appelle une fonction qui est un point d'annulation.

       POSIX.1-2001  et/ou  POSIX.1-2008  exigent  que  les fonctions suivantes soient des points
       d'annulation :

           accept()
           aio_suspend()
           clock_nanosleep()
           close()
           connect()
           creat()
           fcntl() F_SETLKW
           fdatasync()
           fsync()
           getmsg()
           getpmsg()
           lockf() F_LOCK
           mq_receive()
           mq_send()
           mq_timedreceive()
           mq_timedsend()
           msgrcv()
           msgsnd()
           msync()
           nanosleep()
           open()
           openat() [Ajoutée dans POSIX.1-2008]
           pause()
           poll()
           pread()
           pselect()
           pthread_cond_timedwait()
           pthread_cond_wait()
           pthread_join()
           pthread_testcancel()
           putmsg()
           putpmsg()
           pwrite()
           read()
           readv()
           recv()
           recvfrom()
           recvmsg()
           select()
           sem_timedwait()
           sem_wait()
           send()
           sendmsg()
           sendto()
           sigpause() [POSIX.1-2001 seulement (déplacée dans la liste « may » dans
                       POSIX.1-2008)]
           sigsuspend()
           sigtimedwait()
           sigwait()
           sigwaitinfo()
           sleep()
           system()
           tcdrain()
           usleep() [POSIX.1-2001 seulement(fonction retirée dans POSIX.1-2008)]
           wait()
           waitid()
           waitpid()
           write()
           writev()

       POSIX.1-2001 et/ou POSIX.1-2008 indiquent que les fonctions  suivantes  peuvent  être  des
       points d'annulation :

           access()
           asctime()
           asctime_r()
           catclose()
           catgets()
           catopen()
           chmod() [Ajoutée dans POSIX.1-2008]
           chown() [Ajoutée dans POSIX.1-2008]
           closedir()
           closelog()
           ctermid()
           ctime()
           ctime_r()
           dbm_close()
           dbm_delete()
           dbm_fetch()
           dbm_nextkey()
           dbm_open()
           dbm_store()
           dlclose()
           dlopen()
           dprintf() [Ajoutée dans POSIX.1-2008]
           endgrent()
           endhostent()
           endnetent()
           endprotoent()
           endpwent()
           endservent()
           endutxent()
           faccessat() [Ajoutée dans POSIX.1-2008]
           fchmod() [Ajoutée dans POSIX.1-2008]
           fchmodat() [Ajoutée dans POSIX.1-2008]
           fchown() [Ajoutée dans POSIX.1-2008]
           fchownat() [Ajoutée dans POSIX.1-2008]
           fclose()
           fcntl() (pour n’importe quelle valeur de l’argument de commande)
           fflush()
           fgetc()
           fgetpos()
           fgets()
           fgetwc()
           fgetws()
           fmtmsg()
           fopen()
           fpathconf()
           fprintf()
           fputc()
           fputs()
           fputwc()
           fputws()
           fread()
           freopen()
           fscanf()
           fseek()
           fseeko()
           fsetpos()
           fstat()
           fstatat() [Ajoutée dans POSIX.1-2008]
           ftell()
           ftello()
           ftw()
           futimens() [Ajoutée dans POSIX.1-2008]
           fwprintf()
           fwrite()
           fwscanf()
           getaddrinfo()
           getc()
           getc_unlocked()
           getchar()
           getchar_unlocked()
           getcwd()
           getdate()
           getdelim() [Ajoutée dans POSIX.1-2008]
           getgrent()
           getgrgid()
           getgrgid_r()
           getgrnam()
           getgrnam_r()
           gethostbyaddr() [POSIX.1-2001 seulement (fonction retirée dans
                            POSIX.1-2008)]
           gethostbyname() [POSIX.1-2001 seulement (fonction retirée dans
                            POSIX.1-2008)]
           gethostent()
           gethostid()
           gethostname()
           getline() [Ajoutée dans POSIX.1-2008]
           getlogin()
           getlogin_r()
           getnameinfo()
           getnetbyaddr()
           getnetbyname()
           getnetent()
           getopt() (si opterr est différent de zéro)
           getprotobyname()
           getprotobynumber()
           getprotoent()
           getpwent()
           getpwnam()
           getpwnam_r()
           getpwuid()
           getpwuid_r()
           gets()
           getservbyname()
           getservbyport()
           getservent()
           getutxent()
           getutxid()
           getutxline()
           getwc()
           getwchar()
           getwd() [POSIX.1-2001 seulement (fonction retirée dans POSIX.1-2008)]
           glob()
           iconv_close()
           iconv_open()
           ioctl()
           link()
           linkat() [Ajoutée dans POSIX.1-2008]
           lio_listio() [Ajoutée dans POSIX.1-2008]
           localtime()
           localtime_r()
           lockf() [Ajoutée dans POSIX.1-2008]
           lseek()
           lstat()
           mkdir() [Ajoutée dans POSIX.1-2008]
           mkdirat() [Ajoutée dans POSIX.1-2008]
           mkdtemp() [Ajoutée dans POSIX.1-2008]
           mkfifo() [Ajoutée dans POSIX.1-2008]
           mkfifoat() [Ajoutée dans POSIX.1-2008]
           mknod() [Ajoutée dans POSIX.1-2008]
           mknodat() [Ajoutée dans POSIX.1-2008]
           mkstemp()
           mktime()
           nftw()
           opendir()
           openlog()
           pathconf()
           pclose()
           perror()
           popen()
           posix_fadvise()
           posix_fallocate()
           posix_madvise()
           posix_openpt()
           posix_spawn()
           posix_spawnp()
           posix_trace_clear()
           posix_trace_close()
           posix_trace_create()
           posix_trace_create_withlog()
           posix_trace_eventtypelist_getnext_id()
           posix_trace_eventtypelist_rewind()
           posix_trace_flush()
           posix_trace_get_attr()
           posix_trace_get_filter()
           posix_trace_get_status()
           posix_trace_getnext_event()
           posix_trace_open()
           posix_trace_rewind()
           posix_trace_set_filter()
           posix_trace_shutdown()
           posix_trace_timedgetnext_event()
           posix_typed_mem_open()
           printf()
           psiginfo() [Ajoutée dans POSIX.1-2008]
           psignal() [Ajoutée dans POSIX.1-2008]
           pthread_rwlock_rdlock()
           pthread_rwlock_timedrdlock()
           pthread_rwlock_timedwrlock()
           pthread_rwlock_wrlock()
           putc()
           putc_unlocked()
           putchar()
           putchar_unlocked()
           puts()
           pututxline()
           putwc()
           putwchar()
           readdir()
           readdir_r()
           readlink() [Ajoutée dans POSIX.1-2008]
           readlinkat() [Ajoutée dans POSIX.1-2008]
           remove()
           rename()
           renameat() [Ajoutée dans POSIX.1-2008]
           rewind()
           rewinddir()
           scandir() [Ajoutée dans POSIX.1-2008]
           scanf()
           seekdir()
           semop()
           setgrent()
           sethostent()
           setnetent()
           setprotoent()
           setpwent()
           setservent()
           setutxent()
           sigpause() [Ajoutée dans POSIX.1-2008]
           stat()
           strerror()
           strerror_r()
           strftime()
           symlink()
           symlinkat() [Ajoutée dans POSIX.1-2008]
           sync()
           syslog()
           tmpfile()
           tmpnam()
           ttyname()
           ttyname_r()
           tzset()
           ungetc()
           ungetwc()
           unlink()
           unlinkat() [Ajoutée dans POSIX.1-2008]
           utime() [Ajoutée dans POSIX.1-2008]
           utimensat() [Ajoutée dans POSIX.1-2008]
           utimes() [Ajoutée dans POSIX.1-2008]
           vdprintf() [Ajoutée dans POSIX.1-2008]
           vfprintf()
           vfwprintf()
           vprintf()
           vwprintf()
           wcsftime()
           wordexp()
           wprintf()
           wscanf()

       Une implémentation peut également indiquer d'autres fonctions non spécifiées dans la norme
       comme  étant  des  points  d'annulation.  En  particulier,  une  implémentation   marquera
       probablement   toute  fonction  non  standard  qui  peut  bloquer  comme  étant  un  point
       d'annulation (cela inclut la plupart des fonctions qui peuvent modifier des fichiers).

       Il est à remarquer que même si une  application  n’utilise  pas  d’annulation  asynchrone,
       l’appel  d’une  fonction  de  la  liste  ci-dessus  à  partir  d’un gestionnaire de signal
       asynchrone peut provoquer l’équivalent d’une annulation asynchrone. Le code sous-jacent de
       l’utilisateur  peut ne pas s’attendre à une annulation asynchrone et l’état des données de
       l’utilisateur peut devenir incohérent. Par conséquent, les signaux doivent  être  utilisés
       avec précaution lors de l’entrée dans une région d’annulation différée.

   Compiler sous Linux
       Sous  Linux,  les  programmes  utilisant  l'API  pthreads  doivent  être  compilés avec cc
       -pthread.

   Implémentations des threads POSIX sous Linux
       Deux implémentations différentes des threads ont été fournies par la bibliothèque C de GNU
       sous Linux :

       LinuxThreads
              Il  s'agit  de l'implémentation des Pthreads originelle. Depuis la glibc 2.4, cette
              implémentation n'est plus prise en charge.

       NPTL (Native POSIX Threads Library)
              Il s'agit de l'implémentation moderne des Pthreads.  Par  rapport  à  LinuxThreads,
              NPTL  se  conforme mieux aux exigences de la norme POSIX.1 et fournit une meilleure
              performance lors de la création d'un grand nombre de threads. NPTL  est  disponible
              depuis  la  glibc 2.3.2  et  nécessite  des fonctionnalités présentes dans le noyau
              Linux 2.6.

       Ces deux implémentation sont dit  de  type  1:1,  ce  qui  veut  dire  que  chaque  thread
       correspond  à  une  entité  d'ordonnancement  du noyau. Les deux implémentations utilisent
       l'appel système clone(2) de Linux. Dans NPTL, les primitives de synchronisation de threads
       (mutexes,  jonction  de  thread,  etc.) sont implémentées avec l'appel système futex(2) de
       Linux.

   LinuxThreads
       Les fonctionnalités importantes de cette implémentation sont les suivantes :

       -  En plus du thread principal (initial) et  des  threads  créés  par  le  programme  avec
          pthread_create(3), l'implémentation crée un thread de gestion. Ce thread s'occupe de la
          création et de la terminaison des threads. Des problèmes peuvent survenir si ce  thread
          est tué de façon imprévue.

       -  Les  signaux sont utilisés en interne par l'implémentation. Sous Linux 2.2 et suivants,
          les trois premiers signaux temps réel sont utilisés (voir aussi  signal(7)).  Sous  les
          noyaux  plus anciens, LinuxThreads utilise SIGUSR1 et SIGUSR2. Les applications doivent
          éviter d'utiliser un jeu de signaux utilisé par l'implémentation.

       -  Les threads ne partagent pas leur identifiant  de  processus.  (En  fait,  les  threads
          LinuxThreads  sont  implémentés comme des processus partageant plus d'informations qu'à
          l'habitude, mais pas leur  identifiant  de  processus.)  Les  threads  LinuxThreads  (y
          compris le thread de gestion) sont visibles comme des processus différents avec ps(1).

       L'implémentation  LinuxThreads s'écarte de la spécification POSIX.1 par plusieurs aspects,
       dont les suivants :

       -  Les appels à getpid(2) renvoient une valeur distincte dans chaque thread.

       -  Les appels à getppid(2) dans les threads  autres  que  le  thread  principal  renvoient
          l'identifiant  de  processus  du  thread  de  gestion ; à la place, getppid(2) dans ces
          threads renvoie la même valeur que getppid(2) dans le thread principal.

       -  Lorsqu'un thread crée un nouveau processus enfant avec fork(2), n'importe  quel  thread
          doit pouvoir utiliser wait(2) sur l’enfant. Cependant, l'implémentation ne permet qu'au
          thread ayant créé l’enfant d'appeler wait(2) sur lui.

       -  Lorsqu'un thread appelle execve(2), tous les autres threads  sont  terminés  (comme  le
          prescrit  POSIX.1). Cependant, le processus résultant a le même PID que le thread ayant
          appelé execve(2) : il doit avoir le même PID que le thread principal.

       -  Les threads ne partagent pas leurs identifiants d'utilisateur et de groupe.  Cela  peut
          causer  des complications pour les programmes set-user-ID et provoquer des erreurs dans
          les fonctions pthreads si une  application  change  d'identifiant  avec  seteuid(2)  et
          consorts.

       -  Les threads ne partagent pas l'identifiant de session et de groupe de processus.

       -  Les threads ne partagent pas les verrouillages d'enregistrement créés avec fcntl(2).

       -  L'information  renvoyée  par times(2) et getrusage(2) est par thread au lieu d'être par
          processus.

       -  Les threads ne partagent pas les valeurs « undo » de sémaphore (voir semop(2)).

       -  Les threads ne partagent pas les temporisations d'intervalle.

       -  Les threads ne partagent pas leur valeur de politesse.

       -  POSIX.1 distingue les notions de signal envoyé au processus dans  son  ensemble  et  de
          signal  envoyé  à  un  thread  individuellement.  Selon  POSIX.1,  un  signal envoyé au
          processus (par exemple avec kill(2)) sera géré par un thread choisi  arbitrairement  au
          sein  du  processus.  LinuxThreads ne permet pas d'envoyer un signal au processus, mais
          seulement à un thread spécifique.

       -  Les threads ont des paramètres de pile de signaux spécifique distincts. Cependant,  les
          paramètres  de  pile  spécifique d'un nouveau thread sont copiés à partir du thread qui
          l'a créé, ce qui veut dire que les threads partagent  initialement  une  même  pile  de
          signaux   spécifique.  (Un  nouveau  thread  devrait  démarrer  sans  pile  de  signaux
          spécifique. Si deux threads gèrent un signal sur leur pile spécifique au  même  moment,
          des échecs imprévisibles du programme risquent de se produire.)

   NPTL
       Avec  NPTL,  tous  les  threads d'un processus sont placés dans le même groupe de threads.
       Tous les membres d'un groupe de threads partagent le  même  PID.  NPTL  n'utilise  pas  de
       thread de gestion.

       NPTL  utilise  en interne les deux premiers signaux temps réel. Ces signaux ne peuvent pas
       être utilisés dans les applications. Consulter nptl(7) pour davantage de détails.

       NPTL a encore au moins une non conformité à POSIX.1 :

       -  Les threads ne partagent pas leur valeur de politesse.

       Certaines non conformités n'apparaissent qu'avec des noyaux plus anciens :

       -  l'information renvoyée par times(2) et getrusage(2)  est  par  thread  au  lieu  d'être
          globale au processus (corrigé dans Linux 2.6.9) ;

       -  les threads ne partagent pas les limites de ressources (corrigé dans Linux 2.6.10) ;

       -  les   threads   ne   partagent   pas  les  temporisations  d'intervalle  (corrigé  dans
          Linux 2.6.12) ;

       -  seul le thread principal est autorisé à démarrer une nouvelle  session  avec  setsid(2)
          (corrigé dans le noyau 2.6.16) ;

       -  seul  le  thread  principal  est autorisé à rendre le processus leader de son groupe de
          processus avec setpgid(2) (corrigé dans le noyau 2.6.16) ;

       -  Les threads ont des paramètres de pile de signaux spécifique distincts. Cependant,  les
          paramètres  de  pile  de  signaux spécifique d'un nouveau thread sont copiés de ceux du
          thread qui l'a créé, de façon que  les  threads  partagent  initialement  une  pile  de
          signaux spécifique dans Linux 2.6.16).

       Veuillez noter les points suivants à propos de l'implémentation NPTL :

       -  Si  la  limite  souple  de  taille  de  pile  (voir dans setrlimit(2) la description de
          RLIMIT_STACK) est différente de unlimited, cette valeur détermine la taille de pile par
          défaut  pour  les nouveaux threads. Pour avoir un effet, cette limite doit être définie
          avant le démarrage du programme, par exemple en  utilisant  la  commande  ulimit -s  de
          l’interpréteur de commandes (limit stacksize dans csh).

   Déterminer l'implémentation des threads utilisée
       Depuis   glibc 2.3.2,   la   commande   getconf(1)  peut  être  utilisée  pour  déterminer
       l'implémentation de threads du système, par exemple :

           bash$ getconf GNU_LIBPTHREAD_VERSION
           NPTL 2.3.4

       Avec des versions plus anciennes de la glibc, une commande comme la suivante devrait  être
       suffisante pour déterminer l'implémentation de threads par défaut :

           bash$ $( ldd /bin/ls | grep libc.so | awk '{print $3}' ) | \
                           egrep -i 'threads|nptl'
                   Native POSIX Threads Library by Ulrich Drepper et al

   Choisir l'implémentation des threads : LD_ASSUME_KERNEL
       Sur  les  systèmes  avec  une  glibc  fournissant  à  la  fois  LinuxThreads et NPTL (i.e.
       glibc 2.3.x), la variable d'environnement LD_ASSUME_KERNEL peut être utilisée pour écraser
       le  choix  par  défaut d'implémentation de threads fait par l'éditeur de liens dynamiques.
       Cette variable indique à l'éditeur de liens dynamiques qu'il doit faire comme  s'il  était
       exécuté  avec  une  version  particulière  du  noyau. En indiquant une version du noyau ne
       fournissant pas les fonctionnalités nécessitées par NPTL, on peut forcer l'utilisation  de
       LinuxThreads.  (La  raison  la  plus  probable  pour  cela  est d'exécuter une application
       (boguée) qui dépend d'un comportement de LinuxThreads non conforme  à  la  spécification.)
       Par exemple :

           bash$ $( LD_ASSUME_KERNEL=2.2.5 ldd /bin/ls | grep libc.so | \
                           awk '{print $3}' ) | egrep -i 'threads|nptl'
                   linuxthreads-0.10 by Xavier Leroy

VOIR AUSSI

       clone(2), fork(2), futex(2), gettid(2), proc(5), attributes(7), futex(7), nptl(7),
       sigevent(7), signal(7)

       Diverses pages de manuel de Pthreads, par exemple : pthread_atfork(3),
       pthread_attr_init(3), pthread_cancel(3), pthread_cleanup_push(3), pthread_cond_signal(3),
       pthread_cond_wait(3), pthread_create(3), pthread_detach(3), pthread_equal(3),
       pthread_exit(3), pthread_key_create(3), pthread_kill(3), pthread_mutex_lock(3),
       pthread_mutex_unlock(3), pthread_mutexattr_destroy(3), pthread_mutexattr_init(3),
       pthread_once(3), pthread_spin_init(3), pthread_spin_lock(3),
       pthread_rwlockattr_setkind_np(3), pthread_setcancelstate(3), pthread_setcanceltype(3),
       pthread_setspecific(3), pthread_sigmask(3), pthread_sigqueue(3) et pthread_testcancel(3)

TRADUCTION

       La traduction française de cette page de manuel a été créée par Christophe Blaess
       <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry
       Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>,
       Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-
       luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux
       <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin
       Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis
       Barbier <barbier@debian.org>, David Prévot <david@tilapin.org>, Frédéric Hantrais
       <fhantrais@gmail.com> et Jean-Paul Guillonneau <guillonneau.jeanpaul@free.fr>

       Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General
       Public License version 3 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ concernant les
       conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.

       Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un
       message à ⟨debian-l10n-french@lists.debian.org⟩.