欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

信号量 (Semaphore)

程序员文章站 2022-06-04 22:00:07
...

信号量是一种很典型的用于同步和互斥的方法,信号量是是经典的PV操作,通常用于生产者/消费者问题。

P:减1操作,如果执行P之后sem任然大于0则该进程继续执行,否则进入等待状态。
V:加1操作,执行后sem如果大于0,则唤醒等待队列中等待该信号量的进程。

定义信号量:

struct semaphore sem;

初始化信号量:

void sema_init(struct semaphore *sem, int val);

该函数初始化信号量,并设置信号量sem的值为val。

获取信号量:

void down(struct semaphore *sem);

该函数用于获取信号量sem,她会导致睡眠,因此不能用于中断上下文。

int down_interruptible(struct semaphore *sem);

该函数功能与down类似,不同之处为,因为down()进入睡眠状态的进程不能被信号打断,但因为down_interruptible()进入睡眠状态的进程能被信号打断,信号也会导致该函数返回,这时候函数的返回值非0.

int down_trylock(struct semaphore *sem);

该函数尝试获取信号量sem,如果能够立刻获得,他就获取该信号量并返回0, 否则,返回非0值,他不会导致调用者睡眠,可以用于中断上下文中。
在使用down_interruptible()获取信号量时,对返回值一般会进行检查,如果非0,通常立即返回-ERESTARTSYS,如:

if (down_interruptible(&sem))
    return -ERESTARTSYS;

释放信号量:

void up(struct semaphore *sem);

该函数释放信号量sem,唤醒等待者。
作为一种可能的互斥手段,信号量可以保护临界区,他的作用方式和自旋锁类似。与自旋锁相同,*得到信号量的进程才能执
行临界区的代码。但是与自旋锁不同的是,当获取不到信号量时,进程不会忙等,而是会进入睡眠状态,信号量释放之后,会把
该进程从睡眠状态唤醒。

相关标签: 信号量 Semaphore