樊梓慕:个人主页
个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C++》《Linux》《算法》
每一个不曾起舞的日子,都是对生命的辜负
目录
前言
1.生产者消费者模型
1.1概念
1.2特点
2.基于阻塞队列的生产者消费者模型
2.1什么是阻塞队列?
2.2queue模拟阻塞队列的生产消费模型
编辑
3.POSIX信号量
3.1信号量是如何实现互斥和同步的?
3.2信号量的概念
3.3信号量函数
3.3.1初始化信号量sem_init
3.3.2销毁信号量sem_destroy
3.3.3等待信号量sem_wait(P操作)
3.3.4释放信号量sem_post(V操作)
4.基于环形队列的生产者消费者模型
4.1基本原理
4.2两个规则
4.2.1生产者和消费者不能对同一个位置进行访问
4.2.2无论是生产者还是消费者,都不应该将对方套圈
4.3vector模拟环形队列的生产消费模型
本篇文章内容:生产者消费者模型概述、基于阻塞队列BlockQueue的生产者消费者模型、POSIX信号量、基于环形队列的生产者消费者模型。
欢迎大家收藏以便未来做题时可以快速找到思路,巧妙的方法可以事半功倍。
=========================================================================
GITEE相关代码:樊飞 (fanfei_c) - Gitee.com
=========================================================================
生产者消费者模型就是通过一个容器来解决生产者和消费者的强耦合问题。
生产者和消费者彼此之间不直接通讯,而通过某种容器来进行通讯。
所以生产者生产完数据之后不用等待消费者处理,直接扔给容器,消费者不找生产者要数据,而是直接从容器里取,容器就相当于一个缓冲区,平衡了生产者和消费者的处理能力。这个容器就是用来给生产者和消费者解耦的。那么下面我们会介绍两种实现生产者消费者模型的方式:一种是基于阻塞队列的,一种是基于环形队列的。
生产者消费者模型是多线程同步与互斥的一个经典场景,其特点如下:
说明:
所有的生产者和消费者都会竞争式的申请锁,因此生产者和生产者、消费者和消费者、生产者和消费者之间都存在互斥关系。
同步的解释:
同步说白了就是让多线程能够协同起来工作,而不是不管不顾,比如生产者消费者模型场景下: