信号量semaphore

来源:互联网 发布:筒灯什么牌子好 知乎 编辑:程序博客网 时间:2024/06/04 22:30

1.信号量用于保护临界区的一种方法。临界区:在任何给定的时间,只有一个线程可以执行的代码
2.只有得到信号量的进程才能执行临界区代码,当得不到信号量时,进入休眠等待状态
-----------------------------------------------------------
1.定义信号量struct semaphore sem;
2.初始化信号量void sema_init(struct semaphore *sem, int val);
设置信号量sem的值为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);
3.获得信号量
"down"指的是这样的事实, 这个函数递减旗标的值, 并且, 也许在使调用者睡眠一会儿来等待旗标变可用之后, 给予对被保护资源的存取. 有 3 个版本的 down:
void down(struct semaphore *sem);
down 递减旗标值并且等待需要的时间,用于获得信号量sem,它会导致睡眠,因此不能在中断上下文使用,因为down()而进入睡眠的状态的进程不能被信号打断
int down_interruptible(struct semaphore *sem);
操作是可中断的.返回一个非零值
int down_trylock(struct semaphore *sem);
从不睡眠; 如果旗标在调用时不可用,down_trylock 立刻返回一个非零值.
如果能立即获得,它就获得该信号量并返回零
一旦一个线程已经成功调用 down 各个版本中的一个, 就说它持有着旗标(或者
已经"取得"或者"获得"旗标). 这个线程现在有权力存取这个旗标保护的临界区.
当这个需要互斥的操作完成时, 旗标必须被返回. V 的 Linux 对应物是 up:
4.释放信号量
void up(struct semaphore *sem);
一旦 up 被调用, 调用者就不再拥有旗标.该函数释放信号理sem,唤醒等待者
if (down_interruptible(&dev->sem))
return -ERESTARTSYS;
注意对 down_interruptible 返回值的检查; 如果它返回非零, 操作被打断了.
在这个情况下通常要做的是返回 -ERESTARTSYS.

信号量一般这样被使用
/*定义信号量
DECLARE_MUTEX(mount_sem);
down(&mount_sem);/*获得信号量,保护临界区*/
critical section /*临界区*/
up(&mount_sem);/释放信号量*/
5.信号量用于同步
如果信号量被初始化为0,则它可以用于同步,同步意味着一个执行单元的继续执行需等待另一个执行单元完成,保证执行的先后顺序。


0 0