Provided by: manpages-es_1.55-10_all 

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)