您的位置:首页 > 其它

信号量semaphore

2016-01-07 14:40 155 查看
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,则它可以用于同步,同步意味着一个执行单元的继续执行需等待另一个执行单元完成,保证执行的先后顺序。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: