并发控制原理(二)
同步原语简介(续)
信号量
- 生产者-消费者问题(有界缓冲区问题):
两个分别为生产者和消费者的进程共享了一块固定大小的公共缓冲区,生产者产生数据信息,消费者消耗数据信息。整个过程遵循:
- 缓冲区被填满时,生产者需要停止生产
- 缓冲区为空时,消费者需要停止消耗
解决方法:缓冲区被填满时,生产者进入睡眠,直到缓冲区不为空;消费者发现缓冲区为空,进入睡眠,直到缓冲区不为空。
解决的主要途径:信号量(semaphore)
记录缓冲区的元素个数,并规定关于信号量的操作必须为原子操作:P操作、V操作
P操作:对信号量进行减少;V操作:对信号量进行增加
信号量为0,P操作自动睡眠,直到V操作将其唤醒
和有界缓冲区不同,V操作不会进入休眠,相当于无界缓冲区
在Linux中,相当于DOWN、UP操作
void down(struct semaphore* sem