定义一个信号量:
struct semaphore xx_sem;
初始化信号量:
void sema_init(struct semaphore *sem, int val);
把信号量sem初始化为val。如果把信号量初始化为大于1的数,则变成一个计数信号量,不过一般不要这样做。
初始化互斥信号量:
void init_MUTEX(struct semaphore *sem);
初始化sem为1,等同于:
sema_init(struct semaphore *sem, 1);
void init_MUTEX_LOCKED(struct semaphore *sem);
将信号量sem初始化为0;等同于
sema_init(struct semaphore *sem, 0);
简便初始化方式:
DECLARE_MUTEX(xx_sem) //初始化为1
DECLARE_MUTEX_LOCKED(xx_sem) //初始化为0
说明:将信号量初始化为0,可以用于同步。
获取信号量:
void down(struct semaphore *sem);
获取信号量sem;会导致睡眠,不能在中断上下文使用。
void down_interruptible(struct semaphore *sem);
由于down()而进入睡眠的进程不能被信号打断;而因为down_interruptible()进入睡眠的进程可以被信号打断。
int down_trylock(struct semaphore *sem);
尝试获得信号量sem,如果获取成功,立即返回0;否则返回飞0值。不会导致调用者睡眠,可以在中断上下文使用。
释放信号量:
void up(struct semaphore *sem);
一般用法:
DECLARE_MUTEX(xx_sem); //定义并初始化信号量
down(&xx_sem); //获取信号量
。。。。。。 //临界区
up(&xx_sem); //释放信号量
阅读(315) | 评论(0) | 转发(0) |