是一种进程间或线程间同步机制,用于控制多个线程/进程对共享资源的访问,避免并发冲突。可以看作是一个计数器,通过对计数器的操作(PV操作)实现同步
P操作(原子性):--,将信号量的值-1,对应等待资源,若资源不足则阻塞
V操作:++,将信号量的值+1,对应释放资源,若有等待的进程/线程则唤醒
信号量本质也是临界资源
初始化信号量:sem_init
销毁信号量:sem_destory
等待信号量:int sem_wait //p()
发布信号量:int sem_post //V()
资源可以拆分,可以考虑sem。整体使用,使用mutex
环形队列
把普通队列的首尾相连,形成一个环,起始状态和结束状态都是一样的
信号量来保证这四个约定
约定1:为空时,生产者先运行
约定2:为满时,消费者先运行
约定3:生产者不能把消费者超过一个圈以上,可以理解成数据超过了容量,再输入数据就覆盖了,这样是不可行的
约定4:消费者不能超过生产者我们可以理解成警察追小偷,但是超过就就不合理了
1. 只要我们不访问同一个位置,我们就可以同时运行
2. 为空或者为满的时候,我们会在同一个位置
3. 为空:只能[互斥],生产者先[同步]运行
为满:只能[互斥],消费者先[同步]运行
结论1:环形队列,不为空&&不为满,生产消费可以同时进行
结论2:环形队列,为空||为满,生产和消费,需要同步互斥
基于环形队列的生产者消费模型