单片机开发进阶技巧:(三)生产者-消费者模型
上一篇下一篇如何判断一个浮点型运算结果是否为整数目 录生产者-消费者模型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/7/22 10:15:37 阅读更多 →
绿盟堡垒机5611版本—自动改密

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

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

2026/7/23 16:15:32 阅读更多 →
EMIFA异步接口配置:嵌入式存储时序与寄存器详解

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

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

2026/7/22 10:14:37 阅读更多 →

最新新闻

【JPCS出版】2026年工业工程与智能制造国际学术会议 (ICIEIM 2026)

【JPCS出版】2026年工业工程与智能制造国际学术会议 (ICIEIM 2026)

2026年工业工程与智能制造国际学术会议 (ICIEIM 2026) 2026 International Conference on Industrial Engineering and Intelligent Manufacturing 中国•大连 2026年11月13日-2026年11月15日 重要信息 会议官网:2026年工业工程与智能制造国际学术会…

2026/7/23 17:33:15 阅读更多 →
Linux 实时调度:Deadline 任务可调度性与参数完整设计实战

Linux 实时调度:Deadline 任务可调度性与参数完整设计实战

一、简介1.1 技术背景工业机器人、EtherCAT 伺服、自动驾驶、高精度采集设备等硬实时场景,任务存在严格周期 截止时间约束:每 125us/1ms 周期必须完成运算,一旦超时直接导致电机震荡、采样丢帧、控制逻辑失效。 传统SCHED_FIFO/SCHED_RR采用…

2026/7/23 17:33:15 阅读更多 →
openwrt nas_【群晖】用群晖虚拟机安装New Pi(OpenWRT)软路由系统

openwrt nas_【群晖】用群晖虚拟机安装New Pi(OpenWRT)软路由系统

之前的New Pi的固件都是装在Nano Pi或者树莓派上的,今天一起来把它装在群晖的虚拟机上,让他正常运行。重要:底部有视频教程写在前面在群晖中安装虚拟机,安装过虚拟机的可以直接跳过,不过需要强调的是,必须要…

2026/7/23 17:33:15 阅读更多 →
svn突然看不了提交日志,也不能更新,清除

svn突然看不了提交日志,也不能更新,清除

tortoise SVN1.8.8 sqlite studio 3.1.1 操作前,先进行以下操作: 彻底关闭数据库工具、VS、QtCreator等所有占用项目文件的程序。 进入项目根目录下隐藏文件夹 .svn 资源管理器顶部【查看】→ 勾选【隐藏的项目】才能看见 .svn ;在.svn…

2026/7/23 17:33:15 阅读更多 →
JDK8到JDK17新特性总结

JDK8到JDK17新特性总结

从 JDK 8 到 JDK 17,Java 经历了 9 个主版本迭代,其中 JDK 11、JDK 17 为官方长期支持(LTS)版本,也是企业从 JDK 8 升级的主流目标。整体演进方向包括:语法简化、API 现代化、低延迟 GC、模块化、原生性能优…

2026/7/23 17:33:15 阅读更多 →
C++高并发内存池:三层架构设计与性能优化实践

C++高并发内存池:三层架构设计与性能优化实践

1. 项目概述:为什么我们需要一个高并发内存池? 如果你写过一段时间C,尤其是在服务器后台或者游戏引擎这类对性能有极致要求的领域,肯定对 new 和 delete (或者 malloc 和 free )又爱又恨。爱的是它…

2026/7/23 17:32:14 阅读更多 →

日新闻

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:25 阅读更多 →
AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

更多请点击: https://codechina.net 第一章:AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析 在对2,346篇跨行业AI生成文案的A/B测试数据进行聚类分析后,我们发现&#xff1…

2026/7/23 0:01:26 阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:01:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 19:43:43 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/22 12:54:44 阅读更多 →

月新闻