在了解和学习信号量之前,我们需要明确一点,信号量和信号不同,切勿将信号和信号量混淆,因为二者根本不是一个概念。
一、 什么是信号量?
为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,我们需要一种方法,它可以通过生成并使用令牌来授权,在任何时刻只能有一个执行线程访问代码的临界区域。临界区域是指执行数据更新的代码需要独占式地执行。
信号量是一个特殊的变量,程序对其访问都是原子操作,且只提供它等待或者发送两种操作,也就是P操作和V操作。何为P/V操作:举个例子,我们平常最常见也最简单的信号形式——二值信号量。P操作则是对等待的信号量的值进行减一操作,而V操作则是对某一个信号量执行加一操作。这里我们暂时也仅针对于二值信号量来讨论。
二、信号量的工作原理
信号量只能进行两种操作等待和发送信号,即P操作和V操作,他们的行为是这样的:
P:如果信号量的值大于零,就给它减1;如果它的值为零,就挂起该进程的执行直到
该信号量的值不为一为止。
V:如果有其他进程因等待该信号量而被挂起,就让它恢复运行,如果没有进程因等待该 信号量而挂起,就给它加1。
三、 POSIX信号量相关函数
int sem_init(sem_t *sem, int pshared, unsigned int value);
int sem_wait(sem_t *sem);
int sem_post(sem_t *sem);
sem_init可以设置信号量的初始值和初始状态,sem_wait则会等待指定信号量,如果该值为0,则等待,否则对信号量的值减一并获取资源,即P操作。sem_post则对指定信号量的值加一,即V操作。
四、 总结
信号量是一个特殊的变量,程序对其访问都是原子操作,且只允许对它进行等待(即P(信号变量))和发送(即V(信号变量))信息操作。我们通常通过信号来解决多个进程或线程对同一资源的访问竞争的问题。
Copyright © 2004-2024 华清远见教育科技集团 版权所有
京ICP备16055225号-5,京公海网安备11010802025203号