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); /* 释放信号量 */ |