Provided by: manpages-es_1.55-10_all bug

NOMBRE

       futex - llamada al sistema para bloqueos rápidos en espacio de usuario

SINOPSIS

       #include <linux/futex.h>

       #include <sys/time.h>

       int sys_futex (void *futex, int op, int val, const struct timespec *timeout);

DESCRIPCIÓN

       La  llamada  al  sistema sys_futex proporciona un método que permite a un programa esperar
       hasta que cambie el valor de una dirección dada y un método  para  despertar  a  cualquier
       proceso  que  esté  esperando en una dirección particular (aunque las direcciones para una
       misma zona de memoria en procesos separados pueden no ser iguales, el núcleo las  proyecta
       internamente  para que la misma memoria proyectada en direcciones distintas concuerde para
       diferentes llamadas sys_futex). Típicamente se usa para implementar el caso  de  contienda
       de un bloqueo en memoria compartida, como se describe en futex(4).

       Cuando  una  operación  futex(4) termina con contienda en espacio de usuario, es necesario
       hacer una llamada al núcleo para que arbitre. El arbitraje puede significar o bloquear  al
       proceso invocador o, contrariamente, despertar a un proceso bloqueado.

       Se  espera  que  los  procesos que llamen a esta función se adhieran a la semántica que se
       expone en futex(4). Ya que esta semántica supone escribir instrucciones en ensamblador  no
       (trans)portables,  esto  a  su  vez probablemente significa que la mayoría de los usuarios
       serán de hecho autores de bibliotecas y no desarrolladores genéricos de aplicaciones.

       Es necesario que el argumento futex apunte a un entero alineado que almacene el  contador.
       La operación a ejecutar se pasa a través del parámetro op junto con un valor val.

       Actualmente se definen tres operaciones:

       FUTEX_WAIT
              Esta  operación  verifica  atómicamente  si  la dirección futex contiene todavía el
              valor dado y bloquea al proceso a la espera de FUTEX_WAKE en esta dirección  futex.
              Si  el argumento timeout no es NULL, su contenido describe la duración máxima de la
              espera, que es infinita en otro caso. Para futex(4), esta llamada se ejecuta si  al
              decrementar  el  contador  se  obtuvo un valor negativo (indicando contención) y se
              bloqueará hasta que otro proceso libere el futex y ejecute la operación FUTEX_WAKE.

       FUTEX_WAKE
              Esta operación despierta, como mucho, val procesos que esperan  en  esta  dirección
              futex  (es decir, dentro de FUTEX_WAIT).  Para futex(4), esta llamada se ejecuta si
              al incrementar el contador se vio que había procesos esperando una vez que al futex
              se le ha asignado el valor 1 (indicando que está disponible).

       FUTEX_FD
              Para  soportar  despertares  asíncronos,  esta  operación  asocia  un descriptor de
              fichero con un futex. Si otro proceso ejecuta un FUTEX_WAKE, el proceso recibirá el
              número  de señal que se pasó en val. El proceso invocador debe cerrar el descriptor
              de fichero devuelto después de su uso.

              Para  evitar  condiciones  de  carrera,  el  invocador  debe  comprobar  si  se  ha
              incrementado el futex después de que FUTEX_FD regrese.

VALOR DEVUELTO

       Dependiendo  de  la  operación  que  se  haya  ejecutado,  el  valor  devuelto puede tener
       significados diferentes.

       FUTEX_WAIT
              Devuelve 0 si el proceso fue despertado por una llamada FUTEX_WAKE. En el  caso  de
              que  haya  expirado  el  plazo,  se devuelve ETIMEDOUT. Si el futex no era igual al
              valor esperado, la operación devuelve EWOULDBLOCK.  Las  señales  (u  otros  falsos
              despertares) hacen que FUTEX_WAIT devuelva EINTR.

       FUTEX_WAKE
              Devuelve el número de procesos despertados.

       FUTEX_FD
              Devuelve el nuevo descriptor de fichero asociado al futex.

OBSERVACIONES

       Insistimos,  los  futexes,  en  su  forma  más  básica, no están pensados como abstracción
       sencilla para los usuarios finales. Es de esperar  que  los  implementadores  sean  buenos
       conocedores  de  ensamblador  y  que  hayan leído los fuentes de la biblioteca de futex en
       espacio de usuario que se indica más abajo.

AUTORES

       Los futexes fueron diseñados e implementados por Hubertus Franke  (IBM  Thomas  J.  Watson
       Research  Center),  Matthew  Kirkwood,  Ingo  Molnar  (Red Hat) y Rusty Russell (IBM Linux
       Technology Center). Esta página fue escrita por Bert Hubert.

VERSIONES

       El soporte inicial para futex se añadió a la versión 2.5.7 de Linux pero con una semántica
       distinta  a  la  descrita más arriba. La semántica actual se encuentra disponible desde la
       versión 2.5.40 de Linux.

VÉASE TAMBIÉN

       futex(4), `Fuss, Futexes and Furwocks: Fast Userlevel Locking in Linux' (actas del  Ottawa
       Linux    Symposium    2002),    biblioteca    de   ejemplo   de   futex,   futex-*.tar.bz2
       <URL:ftp://ftp.nl.kernel.org:/pub/linux/kernel/people/rusty/>.

                                        31 diciembre 2002                                FUTEX(2)