打印

linux中的互斥途径三:信号量

[复制链接]
261|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
菊江先生|  楼主 | 2018-8-22 09:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
semaphore

使用方法和自旋锁类似,与自旋锁相同,只有得到信号量的进程才能执行临界区代码,但是与自旋锁不同的是当获取不到信号量时,进程不原地打转而是进入休眠等待状态。

1. 函数:声明变量:

struct semaphore sem;

快捷方式:

DECLARE_MUTEX(name) /* 定义一个名为name的信号量并初始化为1 */

DECLARE_MUTEX_LOCKED(name) /* 定义一个名为name的信号量并初始化为0 */

信号量的初始化:

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

参数:

sem,信号量

val,信号量的数量

信号量的获取: --相当于PV操作中的 P 操作

void down(struct semaphore *sem);  -->深度睡眠(没有资源时深度睡眠,无法被唤醒,只有资源来时才醒,是睡眠等待)

int down_interruptible(struct semaphore *sem);  -->可以被唤醒(浅睡)

int down_trylock(struct semaphore *sem); --> 如果能获得,获得,并返回0,否则,返回非0

if(down_interruptible(&sem))

return -ERESTARTSYS;



信号量的释放: --相当于PV操作中的 V 操作

void up(struct semaphore *sem);



2. 使用格式:/* 定义信号量 */

DECLARE_MUTEX(mount_sem);

down(&mount_sem); /* 获取信号量,保护临界区 */

...

critical section /* 临界区 */

...

up(&mount_sem); /* 释放信号量 */

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

446

主题

447

帖子

0

粉丝