5

我需要在锁定/解锁上下文之外的用户空间中调用 do_futex() 的功能。即,我不需要互斥体,而是内核调用do_futex 的确切语义。

似乎它应该在用户空间中可用,因为其目的是尽量减少系统调用的数量,但我无法与之链接。

还是有系统调用?

更新:

我目前正在使用 syscall(__NR_futex, ...) 来运行 do_futex()。但

  1. 我必须包括才能获得 __NR_futex,这很难看
  2. 我必须包含才能获得 FUTEX_WAIT 和 FUTEX_WAKE,但我仍然没有获得 EWOULDBLOCK,或者 WAKE 的最大线程数

有连贯的包装吗?

4

2 回答 2

2

正如在http://locklessinc.com/articles/obscure_synch/上所说:

最后,为了阻止内核等待列表,我们需要使用 Futex 系统调用,不幸的是 linux/futex.h 没有公开它。

他们定义了自己的简单包装器:

#include <linux/futex.h>
#include <sys/syscall.h>

static long sys_futex(void *addr1, int op, int val1, struct timespec *timeout,
                      void *addr2, int val3) {
    return syscall(SYS_futex, addr1, op, val1, timeout, addr2, val3);
}
于 2013-08-26T09:44:32.460 回答
1

futex(2) 系统调用可能是您正在寻找的。

男人 2 futex

另外,在旁注中, man syscalls 给出了所有系统调用的列表。

于 2011-03-22T10:45:24.573 回答