信号量是一种睡眠锁。假如有一个任务想要获得已被占用的信号量,信号量就会将其放入一个等待队列然后让其睡眠,这样CPU可以去处理其他事情。持有信号量的进程将信号释放后,处于等待队列中的一个任务将被唤醒并获得信号量。自旋锁与信号量的第一个区别是前者不会引起调用者睡眠。自旋锁与信号量的选用应该取决于锁被持有的时间长短。如果锁的持有时间较短,使用自旋锁是更好的选择。自旋锁与信号量的第二个区别是信号量允许有多个持有者,而自旋锁只能有一个持有者。
信号量(semaphore)的实现也是和平台相关的。信号量使用semaphore结构描述,它的结构成员count会被初始化为最多的信号量持有者数量。
注意不要直接访问该结构的成员。信号量所允许的并行访问的数目是在信号量创建时定义的,即sema_init函数中的参数val。
void sema_init(struct semaphore*sem,int val);//初始化信号量
信号量最基本的函数组合如下:
void down(struct semaphore*sem);//获得信号量
void up(struct semaphore*sem);//释放信号量,唤醒等待者
获取信号量的函数包括down、down_trylock、down_interruptible。down函数会一直等待信号量。down_trylock函数会尝试获取信号量,假如信号量被占有则立即返回。down函数会导致睡眠,因此不能在中断上下文中使用。在中断上下文中应该选用down_trylock函数:(www.xing528.com)
int down_trylock(struct semaphore*sem);
down_interruptible函数能被信号打断,它的返回值如果是0,表示获得信号量正常返回;如果是-EINTR,表示被信号打断。函数原型如下:
int down_interruptible(struct semaphore*sem);
例3.3 信号量实例
本例使用信号量实现读写互斥,在写过程中特意增加了写延迟,以方便观察代码运行结果。代码见\samples\3synchronous\3-3sem。核心代码如下:
本例运行结果如下:
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。