Provided by: manpages-fr_4.15.0-9_all bug

NOM

       futex – Verrouillage rapide en mode utilisateur

SYNOPSIS

       #include <linux/futex.h>

DESCRIPTION

       Le  noyau  Linux  fournit  des  futex  (« Fast  user-space  mutexes »)  en tant que brique
       permettant un verrouillage rapide et des sémaphores en espace utilisateur. Les futex  sont
       très basiques et se prêtent facilement à la construction d'abstractions de verrouillage de
       plus haut niveau  telles  que  les  mutex,  les  conditions  variables,  les  blocages  en
       écriture/lecture, les barrières et les sémaphores.

       En  fait,  la  plupart  des  programmeurs n’ont pas à utiliser les futex directement ; ils
       s'appuient plutôt sur les bibliothèques construites à partir d’eux, telle que NPTL (Native
       POSIX Thread Library) (consultez pthreads(7)).

       Un  futex  est  identifié  par  une  zone  mémoire  qui peut être partagée entre plusieurs
       processus ou plusieurs fils  d’exécution.  Dans  ces  différents  processus,  il  n'a  pas
       forcément  la  même  adresse.  Dans sa forme la plus simple, un futex a la sémantique d'un
       sémaphore ; il s'agit d'un compteur qui  peut  être  incrémenté  et  décrémenté  de  façon
       atomique. Les processus peuvent attendre que cette valeur devienne positive.

       Une  opération  sur un futex est faite entièrement en espace utilisateur dans le cas où il
       n'y a pas de  sous-capacité.  Le  noyau  n'est  impliqué  que  pour  arbitrer  en  cas  de
       sous-capacité. Comme toute conception saine évite cela, les futex sont aussi optimaux pour
       cette situation.

       Dans sa forme basique, un futex est un  entier  aligné  qui  n'est  modifié  que  par  des
       instructions atomiques d’assembleur. Cet entier se compose de quatre octets sur toutes les
       plateformes. Des processus peuvent partager cet entier en utilisant mmap(2), à  l’aide  de
       segments  de  mémoire  partagés, ou parce qu'ils partagent leur espace mémoire, auquel cas
       l'application est dite multithreadée.

   Sémantique
       Toute opération futex démarre en espace utilisateur,  mais  il  peut  être  nécessaire  de
       communiquer avec le noyau en utilisant l'appel système futex(2).

       Pour   incrémenter   un   futex,   exécuter   les   instructions  assembleur  qui  causent
       l'incrémentation de manière atomique de l'entier par le processeur hôte. Ensuite, vérifier
       si  sa  valeur  a  changé de 0 à 1, auquel cas il n'y avait pas de processus en attente et
       l'opération est réalisée. Il s'agit du cas sans sous-capacité, qui est rapide  et  devrait
       être fréquent.

       En  cas  de  sous-capacité, l'incrémentation atomique a modifié la valeur -1 (ou une autre
       valeur négative) du compteur. Si cette situation est détectée, il y  a  des  processus  en
       attente.  L'espace  utilisateur doit alors définir le compteur à 1 et demander au noyau de
       réveiller les processus en attente avec l'opération FUTEX_WAKE.

       Attendre sur un futex, pour décrémenter le compteur, est l'opération inverse.  Décrémenter
       le  compteur  de  façon  atomique  et  vérifier  si  sa  nouvelle valeur est 0, auquel cas
       l'opération est réalisée et le futex n’était pas dans un cas de sous-capacité.  Dans  tous
       les  autres  cas,  le processus doit régler le compteur à -1 et demander à ce que le noyau
       attende qu'un autre  processus  incrémente  le  futex.  Pour  cela,  utiliser  l'opération
       FUTEX_WAIT.

       Un  délai  peut  éventuellement  être  passé  en  argument à l'appel système futex(2), qui
       indique combien de temps le noyau doit attendre que le futex soit incrémenté. Dans ce cas,
       la  sémantique  est  plus  complexe  et  le programmeur devrait lire futex(2) pour plus de
       détails. La même remarque est valable pour l'attente asynchrone sur un futex.

VERSIONS

       La gestion des futex a été intégrée à Linux 2.5.7, mais avec une sémantique différente  de
       celle décrite ci-dessus. La sémantique actuelle est disponible depuis Linux 2.5.40.

NOTES

       Pour  rappel, les futex de base ne sont pas conçus comme une abstraction facile à employer
       pour les utilisateurs finaux. Les personnes les  mettant  en  pratique  doivent  maîtriser
       l'assembleur  et  avoir  lu  les  sources  de  la bibliothèque futex en espace utilisateur
       décrite ci-dessous.

       Cette page de manuel illustre l'utilisation la plus courante des primitives  futex(2).  Il
       ne s'agit absolument pas de la seule.

VOIR AUSSI

       clone(2),    futex(2),    get_robust_list(2),    set_robust_list(2),   set_tid_address(2),
       pthreads(7)

       « Fuss, Futexes and Furwocks: Fast Userlevel Locking in Linux » (proceedings of the Ottawa
       Linux    Symposium    2002),    bibliothèque    d'exemple    de   futex,   futex-*.tar.bz2
       ⟨ftp://ftp.kernel.org/pub/linux/kernel/people/rusty/⟩.

COLOPHON

       Cette page fait partie de la publication 5.13 du projet man-pages Linux.  Une  description
       du  projet et des instructions pour signaler des anomalies et la dernière version de cette
       page peuvent être trouvées à l'adresse https://www.kernel.org/doc/man-pages/.

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> 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⟩.