版权所有 © 2014 tutorialspoint
futex - 快速用户空间锁定系统调用
#include <linux/futex.h> #include <sys/time.h> int futex(int *uaddr, int op, int val, const struct timespec * timeout , int *uaddr2, int val3);
#include <linux/futex.h>
#include <sys/time.h>
int futex(int *uaddr, int op, int val, const struct timespec * timeout , int *uaddr2, int val3);
futex() 系统调用提供了一种方法,允许程序等待给定地址的值发生变化,以及唤醒等待特定地址的任何进程的方法(虽然不同进程中相同内存的地址可能不相等,但内核会在内部映射它们,因此在不同位置映射的相同内存对于futex() 调用将对应)。正如futex(7)中所述,它通常用于实现共享内存中锁的竞争情况。
当futex(7)操作未在用户空间无竞争地完成时,需要调用内核进行仲裁。仲裁可以意味着使调用进程休眠,或者相反,唤醒等待进程。
此函数的调用者应遵守futex(7)中规定的语义。由于这些语义涉及编写非便携式汇编指令,这反过来可能意味着大多数用户实际上是库作者,而不是一般的应用程序开发人员。
uaddr 参数需要指向一个存储计数器的对齐整数。要执行的操作通过op 参数传递,以及一个值val。
目前定义了五个操作
对于futex(7),如果递减计数得到负值(表示竞争),则执行此调用,并将休眠直到另一个进程释放 futex 并执行 FUTEX_WAKE 操作。
对于futex(7),如果递增计数显示有等待者,则在 futex 值设置为 1(表示可用)后执行此操作。
为了防止竞争条件,调用者应该在 FUTEX_FD 返回后测试 futex 是否已增加。
根据执行的操作,返回值可能具有不同的含义。
需要重申的是,裸 futex 并非旨在作为面向最终用户的易于使用的抽象。预期实现者精通汇编语言,并阅读过下面引用的 futex 用户空间库的源代码。
最初的 futex 支持合并到 Linux 2.5.7 中,但语义与上述描述不同。具有此处给定语义的 4 参数系统调用是在 Linux 2.5.40 中引入的。在 Linux 2.5.70 中添加了一个参数。在 Linux 2.6.7 中添加了第六个参数——混乱,尤其是在 s390 架构上。
此系统调用是 Minux 特定的。
广告