前提
1.信号量的本质是一把计数器
2.申请信号本质就是预订资源
3.PV操作是原子的!
将一个公共资源当做整体访问-->锁
如果公共资源不当做整体使用,多进程可以并发的访问公共资源,但不是同一个区域,为了将资源均分,所以有了信号量。
我们在申请信号量,预订了某个区域的资源,我们需要判断资源是否准备就绪吗?
不需要?我们只要申请成功,这份资源就只属于我,可以直接使用
认识接口
初始化
第一个参数可以设置为全局或者局部
第二个参数是决定是否在线程间共享还是在进程间共享
第三个参数为资源个数
P操作
V操作
发布信号量
销毁
基于环形队列的CP问题
生产者生产一个,往后走一个,直到走到消费者的前一格,此时不能往前走,因为会覆盖自己历史的数据
因此:
消费者不能超过生产者,生产者不能把消费者超过一个圈。
我们只需要在以下两种场景生产者和消费者会指向同一个位置:
两种情况需要判断
1.全空
2.全满
资源的认识:p——>空间 c——>数据
p:sem-space c :sem_data
要满足以上四点,我们只需要用信号量去实现,他会帮我们申请资源并对资源做管理,我们只需要初始化好它、
值得一提的是RingQueue队列多生产多消费问题?
单生产者单消费者RingQueue能不能不做修改就实现多生成多消费,答案是不行
因为信号量是对资源进行分块管理,一个线程只能访问某一个分块资源,也就是说这个信号量保护的仅仅是空间资源和数据资源,但是_p_pos和_c_pos他们没有被保护起来,可能造成数据错乱的问题。
如何解决?
加锁
为什么锁是加在申请信号量之后?
申请信号量是原子性的,是不需要被锁保护的,锁维护的临界区越大,效率其实越低,如果加在申请信号量之前,那么多消费者或多生产者在进入函数后,就不能同时去申请信号量,造成效率降低。