futex
使用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)
其中uaddr为地址,val为对应期望值,timeout等待时间
在内核中每个futex实际就是一个对齐的物理地址,相同物理地址的futex认为是同一个futex,
可以通过shared-mem利用futex完成进程间同步
其中op值指定了要进行的futex操作:
FUTEX_WAIT,如果uaddr不为val,等待timeout
FUTEX_WAKE,唤醒在uaddr上等待的进程,最多唤醒val个进程
FUTEX_FD,已不支持
FUTEX_REQUEUE,无用
FUTEX_CMP_REQUEUE,首先判定uaddr的值是否为val3,如果不是返回EAGAIN
然后,唤醒val个在uaddr上等待的进程,
再将val2个等待进程转移到对uaddr2的等待上
val2 = *((int *)timeout)
可以看出,所有FUTEX_WAKE都可以通过FUTEX_CMP_REQUEUE来实现。
在内核中实现了一个针对于uaddr的hash表,FUTEX_WAIT将task enqueue到hash表中,
FUTEX_CMP_REQUEUE按照uaddr完成对task的dequeue。

浙公网安备 33010602011771号