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