【设计模式】生产者消费者模型

news2024/11/15 6:00:56

带你轻松理解生产者消费者模型!生产者消费者模型可以说是同步与互斥最典型的应用场景了!文末附有模型简单实现的代码,若有疑问可私信一起讨论。

文章目录

  • 一:为什么要使用生产者消费者模型?
  • 二:生产者消费者模型的优点
  • 三:基于阻塞队列的生产者和消费者之间的关系
  • 四:基于BlockingQueue的生产者消费者模型

一:为什么要使用生产者消费者模型?

生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过中间容器(阻塞队列,环形队列等)来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。这个阻塞队列就是用来给生产者和消费者解耦的。
在这里插入图片描述

二:生产者消费者模型的优点

  • 解耦
  • 支持并发
  • 支持忙闲不均

💡此处的并发并不是在临界区中并发,而是说生产时和消费时各自执行(即消费任务的同时也在制作任务),实现并发!
💡此处的忙闲不均体现在制作任务和消费任务的花费时间不同。

三:基于阻塞队列的生产者和消费者之间的关系

同步:当队列为空时,消费者只有阻塞等待生产者生产之后才可被唤醒继续消费。当队列为满时,生产者只有阻塞等待消费者消费后才可被唤醒继续生产。
互斥:体现在生产者与生产者,消费者与消费者之间,同一时刻只允许一个执行流进入临界区访问临界资源。生产者与消费者之间在队列为满或者为空时也有体现互斥性,同一时刻只允许一方访问临界资源。

四:基于BlockingQueue的生产者消费者模型

在多线程编程中阻塞队列(Blocking Queue)是一种常用于实现生产者和消费者模型的数据结构。其与普通的队列区别在于,当队列为空时,从队列获取元素的操作将会被阻塞,直到队列中被放入了元素;当队列满时,往队列里存放元素的操作也会被阻塞,直到有元素被从队列中取出(以上的操作都是基于不同的线程来说的,线程在对阻塞队列进程操作时会被阻塞)
在这里插入图片描述
示例代码:基于阻塞队列的生产者消费者模型代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/420506.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JDK 17:Java 17 中的新特性简介

Java 开发工具包 (JDK) 17 将是一个长期支持 (LTS) 版本,预计来自 Oracle 的扩展支持将持续数年。该功能集定于 6 月 10 日冻结,届时 JDK 17 将进入初始阶段。作为 OpenJDK JDK 17 的一部分提交的功能包括: 特定于上下文的反序列化过滤器允许…

计算机网络 实验一

⭐计网实验专栏,欢迎订阅与关注! ★观前提示:本篇内容为计算机网络实验。内容可能会不符合每个人实验的要求,因此以下内容建议仅做思路参考。 一、实验目的 掌握在Packet Tracer软件中搭建实验平台,配置基本的网络参数…

8D和A3报告

8D和3A报告,他们都不仅仅是记录问题的一种文书,而是解决问题的工具。 A3发展于TPS (Toyota Production system),可以用来解决问题,沟通,记录,是一种流程,当人们在使用A3…

MySQL中添加新字段

© Ptw-cwl 要在MySQL中添加新字段,您可以使用ALTER TABLE语句。 以下是添加新字段的基本语法: ALTER TABLE table_name ADD column_name datatype;其中: table_name 是您要在其中添加新字段的表的名称。column_name 是新字段的名称。…

Linux安装Anaconda

目录1.下载Anaconda的安装包2.安装Anaconda3.用conda创建虚拟环境4.安装项目依赖包1.下载Anaconda的安装包 首先需要在官网上选择需要安装的版本。 官网地址:https://repo.anaconda.com/archive/,如选择当前最新版本进行安装: https://repo.…

TWIST阅读笔记

目录TWIST: Two-Way Inter-label Self-Training for Semi-supervised 3D Instance Segmentation摘要本文方法语义引导的实例提议生成提议纠正基于提议的伪标签更新TWIST: Two-Way Inter-label Self-Training for Semi-supervised 3D Instance Segmentation 摘要 利用无标签数…

浙大版《C语言程序设计实验与习题指导(第3版)》题目集实验2合集

实验2-1-1 计算摄氏温度 本题要求编写程序,计算华氏温度100F对应的摄氏温度。计算公式:C5(F−32)/9,式中:C表示摄氏温度,F表示华氏温度,输出数据要求为整型。 输入格式:本题目没有输入。 输出格式:按照下…

Java每日一练(20230413)

目录 1. 子集 II 🌟🌟 2. 快乐数 ※ 3. 整数反转 ※ 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 子集 II 给你一个整数数组 nums ,其中可能…

【pip换源操作】解决用pip下载Python第三方库慢问题

python自带的第三方库使用pip安装速度会很慢,还有可能会报错。 常见的报错信息有: check_hostname requires server_hostname raise ValueError(“check_hostname requires server_hostname”) ValueError: check_hostname requires server_hostname EO…

波尔模型的实验验证之类氢粒子光谱类实验

光谱产生的原因:原子中电子在轨道上跃迁产生,如莱曼系为电子从n2,3,4等轨道跃迁到n1的基态轨道产生。 中心的原点为原子核,中心最接接近原子核的圆为n1的电子轨道。 r_na_0n^2,轨道大小正比于n的平方 根据电子轨道图即可以获得…

AE开发之图层渲染20210603

AE开发之图层渲染比例符号化地图的整饰唯一值符号的符号化过程点符号设置,线符号设置标注图层,(写得不好,不推荐看) 唯一值符号化,字段进行设置,这里用到了UniqueValueRenderer接口,这里面有一…

用pyocd读写gd32f4系列mcu的otp区

如前一篇文章所述,pyocd是一个调试、编程cortex-m单片机的简单、强大的工具,本文就结合实例讲解pyocd的一些用法。 使用j-link、dap-link等工具在keil或其它ide中调试单片机程序的场景比较常见,而使用这些工具对单片机片内和片外flash存储区…

[ 应急响应基础篇 ] evtx提取安全日志 事件查看器提取安全日志

🍬 博主介绍 👨‍🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…

【C++中关于abs()函数的告警问题】“abs“ is ambiguousC/C++(266)

C中关于abs()函数的告警问题 “abs” is ambiguousC/C(266) 在调试异常打卡记录这道华为OD机考题的时候,完成了C版本之后,在vscode进行调试,出现了如下的告警:abs有歧义,所以就开始查找到底是设什么原因: …

MAC-安装Java环境、JDK配置、IDEA插件推荐

背景:发现经常换电脑装环境等比较麻烦,主要还是想记录一下,不要每次安装都到处翻。。 1、下载并安装JDK 到官网下载所需的JDK:https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.html 这儿下…

Wine运行器帮助——使用Qemu User运行Wine(理论支持全架构)

提醒 Qemu 的转换效率较低,如果可以的话建议使用其它方案以提升运行效率 此方案理论上支持全架构(amd64、arm64、mips64、loongarch64、riscv64、ppc64、s390x……),只要能跑 Qemu User 即可,在 x86、arm64 真机测试通…

[建议收藏]45 个 Git 经典操作场景,专治各种不会合并代码的童鞋~~

有人说:一个人从1岁活到80岁很平凡,但如果从80岁倒着活,那么一半以上的人都可能不凡。 生活没有捷径,我们踩过的坑都成为了生活的经验,这些经验越早知道,你要走的弯路就会越少。

FFmpeg基础

FFmpeg介绍 FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码libavcodec,为了保证高可移植性和编解码质量…

老胡的周刊(第086期)

老胡的信息周刊[1],记录这周我看到的有价值的信息,主要针对计算机领域,内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。🎯 项目MochiDiffusion[2]在 MacOS 上运行原生的 Stab…

20230412-使用STM32实现内部flash模拟U盘

最近用STM32F103CBT6搞了个U盘功能 ​ 工程师干了几年后,基本会有小外包的生活,算是赚外快吧,搞小钱改善伙食,嘻嘻。。。。 ​ 最近有个客户找到我,说是否通过ST的单片机搞个U盘功能,有些文件通过U盘拖拽…