pthread-mutex使用原子操作和futex来实现锁,
使用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。
kernel/futex.c 中 futex_wait() 实现了对task的enqueue,
futex_requeue()实现了dequeue相关
阅读(9823) | 评论(1) | 转发(2) |