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。

posted @ 2015-12-31 14:02  牧 天  阅读(683)  评论(0)    收藏  举报