Chinaunix首页 | 论坛 | 博客
  • 博客访问: 467797
  • 博文数量: 143
  • 博客积分: 6159
  • 博客等级: 准将
  • 技术积分: 1667
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-25 23:08
文章分类

全部博文(143)

文章存档

2013年(1)

2012年(11)

2011年(55)

2010年(76)

分类:

2010-10-17 20:52:48

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相关

阅读(9792) | 评论(1) | 转发(2) |
0

上一篇:pthread_mutex

下一篇:捂性

给主人留下些什么吧!~~

chinaunix网友2010-10-18 15:27:30

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com