- 一个生产者一个消费者共用一个缓冲区
![](https://i-blog.csdnimg.cn/blog_migrate/52d7485f6c5dec366a3c063b7ecc0d5b.png)
程序改进
empty初始值为1 , 代表刚开始缓冲区为空, 生产者可以放东西
full初始值为0, 代表缓冲区没有放东西, 消费者不能去取东西
这里的while不能改为if, 如果改了的话就会只执行一下然后就会执行后面的程序,不能起到阻塞的作用
![](https://i-blog.csdnimg.cn/blog_migrate/b0ed6e71e790e8cf2e21337a60ed8c0b.png)
- 一个生产者, 一个消费者, 共享N个缓冲区
问题:能否同时读或者写一个缓冲区
答案:不能
![](https://i-blog.csdnimg.cn/blog_migrate/41a608998670b762203221bf7ebfb7c6.png)
如果把shina往上移一行,就可以更及时的通知对方, 提高效率
不添加信号量时的操作
![](https://i-blog.csdnimg.cn/blog_migrate/a9a2038b8098c4a0fd4939758b8cd730.png)
![](https://i-blog.csdnimg.cn/blog_migrate/2c6f42cef47d5e83688e7be7d7461a27.png)
![](https://i-blog.csdnimg.cn/blog_migrate/8b7052ceb727ff0c11c49ad2eb7b813e.png)
- 多个生产者, 一个消费者, N个缓冲区
注意:生产者生产产品和放入缓冲区是两个不同的行为
![](https://i-blog.csdnimg.cn/blog_migrate/abd9e38dd5413861cd1bda48d1d74c68.png)
对上面的代码改进
![](https://i-blog.csdnimg.cn/blog_migrate/e4d112a6ffbd598369fa4c70679e6f08.png)
- 多个生产者 多个消费者 N个缓冲区
缓冲区只能一个线程在里面
in/out只能一个线程操作
![](https://i-blog.csdnimg.cn/blog_migrate/b3e648e48bd4bf359092eebb36dfcf96.png)