Linux信号量的实现

#include <asm/semaphore。h>


初始化
-----------------------------------------
使用sema_init()初始化一个信号量
void sema_init(struct semaphore *sem, int val);
注: 其中val是信号量的初始值

使用宏初始化信号量
DECLARE_MUTEX(name);        // 把一个称为name的信号量变量初始化为1
DECLARE_MUTEX_LOCKED(name); // 把一个称为name的信号量变量初始化为0

动态分配:
void init_MUTEX(struct semaphore *sem);       // 用于运行时的初始化
void init_MUTEX_LOCKED(struct semaphore *sem);





持有信号量
---------------------------------------
在Linux世界中,P函数被称为down,指的是该函数减小了信号量的值,它也许会将调用者置于休眠状态,然后等待信号量变得可用,之后再授予调用者对被保护资源的访问权限。 down函数有三个版本:

void down(struct semaphore *sem);             // 减小信号量的值,并在必要时一直等待
int down_interruptible(struct semephore *sem);// 可中断版本,常用
作为通常规则,我们不应该使用非中断版本。使用down_interruptible()需要额外小心,如果操作被中断,该函数会返回非0值,而调用者不会拥有该信号量。因此对down_interruptible()的正确使用需要始终检查返回值, 并做出相应的响应。

int down_trylock(struct semaphore *sem);
永远不会休眠, 如信号量在调用时不可获得, 立即返回非0值。





释放信息量
---------------------------------------
当一个线程成功调用down函数的某个版本之后, 就称为该线程拥有了该信号量, 可以访问被该信号量保护的临界区。 当互斥操作完成后, 必须释放该信号量。Linux的V函数是up:
void up(struct semaphore *sem);  // 调用up之后, 调用者不再拥有该信号量

任何拿到信号量的线程都必须通过一次、只能有一次对up的调用而释放该信号量。在出现错误的情况下,需要特别小心,如果在拥有了一个信号量后发生了错误,必须在返回时释放该信号量。我们容易犯的错误是: 忘记释放信号量,其结果是进程在某些无关位置处于挂起状态,很难复现和跟踪。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值