[转]linux信号量的实现

原文地址:http://blog.sina.com.cn/s/blog_460b9cbf0100gxtv.html

要使用信号量,内核代码必须包括<asm/semaphore.h>。相关的类型是struct semaphore;实际的信号量可通过几种途径来声明和初始化。其中之一是直接创建信号量,这通过sema_init完成:

viod sema_init(struct semaphore *sem,int val);

其中val是赋予一个信号量的初始值。

不过,信号量通常用于互斥模式。为了让这种情况更加简单,内核提供了一组辅助函数和宏。因此,我们可以用下面的方法之一来声明和初始化互斥体:

DECLARE_MUTEX(name);

DECLARE_MUTEX_LOCKED(name);

上面两个宏的结果是,一个称为name的信号量被初始化为1(DECLARE_MUTEX)或者0(使用DECLARE_MUTEX_LOCKED)。在后面一种情况下,互斥体的初始状态时锁定的,也就是说,在允许任何线程访问之前,必须显式地解锁该互斥体。

   如果互斥体必须在运行时被初始化(例如在动态分配互斥体的情况下),应使用下面的函数之一:

void init_MUTEX(struct semaphore * sem);

void init_MUTEX_LOCKED(struct semaphore *sem);

在linux世界中,P函数被称为down--或者这个名字的其它变种。这里,"down"指的是该函数减小了信号量的值,它也许会被调用者置于休眠状态,然后等待信号量变得可用,之后授予调用者对被保护资源的访问。下面是down的三个版本:

void down(struct semaphore *sem);

int down_interruptible(struct semaphore *sem);

int down_trylock(struct semaphore *sem);

down减少信号量的值,并在必要时一直等待。down_interruptible完成相同的工作,但操作是可中断的。可中断的版本几乎是我们始终要使用的版本,它允许等待在某个信号量上的用户空间的进程可被用户中断。使用down_interruptible需要额外小心,如果操作被中断,该函数会返回非零值,而调用者不会拥有该信号量。对down_interruptible的正确使用需要始终检查返回值,并作出相应的响应。

最后一个版本(down_trylock)永远不会休眠;如果信号量在调用时不可获得,down_trylock会立即返回一个非零值。

   当一个线程成功调用上述down的某个版本之后,就称为该线程”拥有“(或”拿到“,”获取“)了改信号量。这样,该线程就被赋予访问由该信号量保护的临界区的权利。当互斥操作完成后,必须返回该信号量。Linux等价于V的函数是up:

void up(struct semaphore * sem);

调用up之后,调用者不再拥有该信号量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值