单片机开发进阶技巧:(三)生产者-消费者模型
上一篇下一篇如何判断一个浮点型运算结果是否为整数目 录生产者-消费者模型1定义2核心同步问题3实现方式3.1基于信号量的经典方案3.2在 RTOS 中如 FreeRTOS4实际工作中常见的应用场景5总结生产者-消费者模型1定义生产者-消费者模型 是并发编程中最经典的设计模式之一用于解决多线程/多进程之间数据传递与协作的问题。生产者Producer负责生成数据比如传感器采集、网络接收、文件读取。消费者Consumer负责处理数据比如计算、显示、存储、转发。共享缓冲区Buffer一个固定大小的队列或环形缓冲区生产者把数据放进去消费者从里面取出来。三者关系[生产者] —(写入)— [共享缓冲区] —(读取)— [消费者]。为什么需要这个模型好处说明解耦生产者和消费者互不依赖可以独立变化平衡速度差异生产者快、消费者慢时数据暂存缓冲区不会丢失或阻塞异步处理生产者在产生数据后不必等消费者处理完可以立刻去做下一件事支持并发多个生产者和多个消费者可以同时工作2核心同步问题共享缓冲区是临界资源需要解决两个问题问题描述典型解决方式互斥同一时刻只能有一个线程修改缓冲区互斥锁mutex同步缓冲区满时生产者必须等待缓冲区空时消费者必须等待信号量semaphore3实现方式3.1基于信号量的经典方案// 假设有一个长度为 N 的环形缓冲区sem_tempty_slots;// 初始值为 N空位数sem_tfilled_slots;// 初始值为 0已填数据数mutex_tbuffer_mutex;// 保护缓冲区操作voidproducer(){while(1){itemproduce_item();sem_wait(empty_slots);// 等有空位mutex_lock(buffer_mutex);insert_item(item);// 放入缓冲区mutex_unlock(buffer_mutex);sem_post(filled_slots);// 通知有新数据}}voidconsumer(){while(1){sem_wait(filled_slots);// 等有数据mutex_lock(buffer_mutex);itemremove_item();// 取出缓冲区mutex_unlock(buffer_mutex);sem_post(empty_slots);// 通知有空位consume_item(item);}}3.2在 RTOS 中如 FreeRTOS通常会用消息队列Queue直接实现队列本身已经内置了互斥和同步机制QueueHandle_t xQueuexQueueCreate(QUEUE_LENGTH,sizeof(Data_t));// 生产者voidvProducerTask(void*pvParameters){Data_t data;// ... 生成数据xQueueSend(xQueue,data,portMAX_DELAY);}// 消费者voidvConsumerTask(void*pvParameters){Data_t data;xQueueReceive(xQueue,data,portMAX_DELAY);// ... 处理数据}4实际工作中常见的应用场景场景生产者消费者缓冲区日志系统各个业务线程产生日志单独的日志线程写入文件无锁环形缓冲区串口通信串口接收中断ISR数据解析线程RingBuffer网络包处理网卡驱动接收数据协议栈线程LwIPpbuf 链表 / 队列传感器数据采集定时器中断采集 ADC数据处理/上传线程双缓冲或队列5总结生产者消费者模型就是通过一个共享的缓冲区把“生产数据”和“消费数据”两个动作分开让它们可以并发、异步地执行并利用互斥和同步机制保证数据安全与流程协调。

相关新闻

告别熬夜对账!这款小程序帮烘焙老板实时掌控门店营收

告别熬夜对账!这款小程序帮烘焙老板实时掌控门店营收

一、核心价值定位 传统实体门店尤其是烘焙行业普遍存在数据管理痛点:经营数据更新滞后,每日营收、销量、客流依靠电脑后台与人工统计,制表对账耗时易出错;店主外出、巡店时无法实时掌握门店经营状况,运营决策只能依靠…

2026/10/13 2:21:18 阅读更多 →
绿盟堡垒机5611版本—自动改密

绿盟堡垒机5611版本—自动改密

通过堡垒机的设备改密/改密计划功能,可以实现对运维服务器、设备的批量改密,也可以实现服务器的密码托管。目前堡垒机支持Windows以及字符类协议(ssh、telnet)设备的改密,目前堡垒机仅支持修改堡垒机上存储的设备账号&…

2026/10/13 13:37:24 阅读更多 →
EMIFA异步接口配置:嵌入式存储时序与寄存器详解

EMIFA异步接口配置:嵌入式存储时序与寄存器详解

1. EMIFA异步接口:嵌入式存储系统的“交通指挥官” 在嵌入式系统开发中,处理器与外部存储器的通信效率直接决定了整个系统的性能上限。想象一下,你的微控制器(MCU)是大脑,而外部的NOR Flash或SRAM是它的“外…

2026/10/2 0:32:36 阅读更多 →

最新新闻

UE5 C++ JSON读写:FJsonObject与FJsonValue完全解析

UE5 C++ JSON读写:FJsonObject与FJsonValue完全解析

最近在某个项目的存档模块里折腾 JSON 读写,UE5 的 C 侧 API 绕来绕去,最后发现核心就两个类:FJsonObject和FJsonValue。如果你也在跟教程学 UE5 C 的 JSON 部分,到了第 61-3 节这里刚好进入最绕的一段——类继承链、各种 Value 子…

2026/10/13 13:37:18 阅读更多 →
低代码平台定制化能力边界:从需求分级到选型落地

低代码平台定制化能力边界:从需求分级到选型落地

低代码/无代码平台这两年风头很猛,几乎每个做企业服务的团队都在聊。但落到实际选型时,大家心里其实都悬着一个问题:这种拖拖拽拽就能搭出来的系统,到底能不能扛住企业里那些“奇奇怪怪”的定制化需求?我接触过不少项目…

2026/10/13 13:37:18 阅读更多 →
智能体技能库实战:从函数堆砌到可编排技能体系

智能体技能库实战:从函数堆砌到可编排技能体系

那段时间我正好在做一个内部数据分析Agent,功能倒是不复杂,但技能函数越堆越多,从最初的十几个一路涨到八十多个。真正让我警醒的是一次线上失误:模型在众多工具里挑了一个相近但错误的函数去执行,把周报数据算成了残缺…

2026/10/13 13:37:18 阅读更多 →
数据复制实战:HDFS副本策略、机架感知与DistCp一致性校验

数据复制实战:HDFS副本策略、机架感知与DistCp一致性校验

做大数据这些年,我越来越确信一件事:分布式系统里“数据复制”才是那个平时看不见、出事全靠它的底层保命机制。节点掉盘、误删目录、磁盘静默损坏、跨集群迁移容灾,每一件都绕不开“复制”两个字。这篇文章想把数据复制的核心技术拆开讲清楚…

2026/10/13 13:37:18 阅读更多 →
CSAPP第九章精要:虚拟内存机制与malloc实现原理

CSAPP第九章精要:虚拟内存机制与malloc实现原理

1. 为什么学完CSAPP第九章,我反而更不敢写malloc了?刚带完一届某高校系统编程实训课,有个现象特别有意思:学生把《深入理解计算机系统》(CSAPP)第九章“虚拟存储器”从9.1读到9.5,笔记记得密密麻…

2026/10/13 13:37:18 阅读更多 →
入侵检测与入侵防御:IDS和IPS的区别、原理与部署实践

入侵检测与入侵防御:IDS和IPS的区别、原理与部署实践

入侵检测和入侵防御这两个概念,从名字上只差两个字,但真实网络里的差别相当大。很多刚接触安全建设的人,习惯把二者当成“功能差不多的同类设备”,结果通常到部署那一刻才反应过来:一个只能看,一个真的动手…

2026/10/13 13:36:17 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →