liunx驱动----信号量的实现

使用信号量必须包含  <asm/semaphore.h>  头文件.其中相关结构体  struct semaphore

 

可以通过以下几种方式来声明或者初始化。

1.void sema_init(struct semaphore *sem, int val)  

  代码如下:val为设置信号量的初始值

  

static inline void sema_init(struct semaphore *sem, int val)
{
    atomic_set(&sem->count, val);//设置型号量的初始值。
    sem->sleepers = 0;
    init_waitqueue_head(&sem->wait);
}

2.DECLARE_MUTEX(name)

  

#define DECLARE_MUTEX(name) __DECLARE_SEMAPHORE_GENERIC(name,1)

  将一个信号量初始化为1

3.DECLARE_MUTEX_LOCKED(name)

  

#define DECLARE_MUTEX_LOCKED(name) __DECLARE_SEMAPHORE_GENERIC(name,0)

  将一个信号量初始化为0

注意:1表示信号量打开,可以访问。0表示锁定。

 在运行的过程中初始化信号量:

static inline void init_MUTEX(struct semaphore *sem)
static inline void init_MUTEX_LOCKED(struct semaphore *sem)

 

 

down函数作用是减小信号量的值。

static inline void down(struct semaphore * sem)//减小信号量的值,在必要的时候一直等待。
static inline int down_interruptible (struct semaphore * sem)//与down效果一样,只是说操作是可以中断的。
static inline int down_trylock(struct semaphore *sem)//函数中没有调用might_sleep(); 所以不会休眠,调用时会立即返回

 

posted @ 2019-05-07 22:42  Dipsyhu  阅读(260)  评论(0编辑  收藏  举报