Voltar à lista
Linux x86_64IPC & sincronização#202

futex

Primitiva de sincronização de baixo nível ('fast userspace mutex') usada para implementar mutexes, condvars e semáforos eficientes.

Descrição

No caminho comum (sem contenção), mutexes em espaço de usuário nunca chamam essa syscall — apenas fazem operações atômicas na própria memória. `futex` só entra em ação para bloquear/acordar threads quando há contenção real, tornando-a a base de desempenho de praticamente toda sincronização de threads no Linux (pthreads, pthread_mutex, std::mutex do C++, etc.).

Header: linux/futex.hman 2Desde o kernel 2.5.7

Nota

Praticamente nunca chamada diretamente por aplicações — é implementação interna de glibc (pthreads) e de runtimes de linguagem.

Assinatura

long futex(
    uint32_t * uaddr,
    int futex_op,
    uint32_t val,
    const struct timespec * timeout,
    uint32_t * uaddr2,
    uint32_t val3
);

Parâmetros

ParâmetroTipoDescrição
uaddruint32_t *Endereço da palavra de 32 bits em memória compartilhada usada como futex.
futex_opintOperação: FUTEX_WAIT, FUTEX_WAKE, FUTEX_REQUEUE, FUTEX_CMP_REQUEUE, etc., combinável com FUTEX_PRIVATE_FLAG.
valuint32_tValor esperado em *uaddr (FUTEX_WAIT) ou número de threads a acordar (FUTEX_WAKE), conforme a operação.
timeoutconst struct timespec *Timeout para operações de espera, ou NULL.
uaddr2uint32_t *Segundo endereço futex, usado por operações de requeue.
val3uint32_tArgumento adicional, cujo significado depende da operação.

Registradores (x86_64)

RegistradorPapelArgumento
raxnúmero da syscall (chamada) / valor de retorno (após SYSCALL)
rdiargumento 1uaddruint32_t *
rsiargumento 2futex_opint
rdxargumento 3valuint32_t
r10argumento 4timeoutconst struct timespec *
r8argumento 5uaddr2uint32_t *
r9argumento 6val3uint32_t

Valor de retorno

Depende da operação (frequentemente 0 em sucesso); -1 em erro, com errno definido.

Códigos de erro (errno)

EAGAIN(11)
Recurso temporariamente indisponível (tente novamente); também conhecido como EWOULDBLOCK.
EINTR(4)
Chamada interrompida por um sinal.
EINVAL(22)
Argumento inválido.
ETIMEDOUT(110)
Conexão expirou (timeout).
EFAULT(14)
Endereço de memória inválido (ponteiro fora do espaço de endereçamento válido).

Relacionadas