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)