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

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

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

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

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

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

2026/8/12 3:29:10 阅读更多 →

最新新闻

HarmonyOS 7.0 / API 26 ArkWeb 安全跳转排查:外链打开、返回栈和权限提示如何统一收口

HarmonyOS 7.0 / API 26 ArkWeb 安全跳转排查:外链打开、返回栈和权限提示如何统一收口

先把问题摆出来 这篇只讲一个点:ArkWeb 安全跳转。我不按官方说明书那种顺序铺概念,而是按开发时最容易出事的路径来拆:什么时候会坏、怎么复现、怎么修、怎么验证,以及这个判断以后能不能复用。 ArkWeb 页面里最容易乱的是外链、…

2026/8/17 20:12:27 阅读更多 →
实验室数据总在“失控“边缘?这个免费开源电子实验记录本让整个团队一夜归一

实验室数据总在“失控“边缘?这个免费开源电子实验记录本让整个团队一夜归一

实验室数据总在"失控"边缘?这个免费开源电子实验记录本让整个团队一夜归一 【免费下载链接】elabftw :notebook: eLabFTW is the most popular open source electronic lab notebook for research labs. 项目地址: https://gitcode.com/gh_mirrors/el/e…

2026/8/17 20:12:27 阅读更多 →
如何用大疆云API快速搭建无人机控制平台?DJI Cloud API Demo 实战拆解

如何用大疆云API快速搭建无人机控制平台?DJI Cloud API Demo 实战拆解

如何用大疆云API快速搭建无人机控制平台?DJI Cloud API Demo 实战拆解 【免费下载链接】DJI-Cloud-API-Demo 项目地址: https://gitcode.com/gh_mirrors/dj/DJI-Cloud-API-Demo 如果你正在给机场、电力巡检或安防团队做一套"无人机管理后台"&…

2026/8/17 20:12:27 阅读更多 →
BepInEx 游戏插件框架快速上手:从签名耗尽崩溃到插件稳定加载

BepInEx 游戏插件框架快速上手:从签名耗尽崩溃到插件稳定加载

BepInEx 游戏插件框架快速上手:从签名耗尽崩溃到插件稳定加载 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx BepInEx 是一个面向 Unity(Mono / IL2CPP&…

2026/8/17 20:12:27 阅读更多 →
免费解锁Wand游戏修改器高级功能:开源增强工具Wand-Enhancer完整上手攻略

免费解锁Wand游戏修改器高级功能:开源增强工具Wand-Enhancer完整上手攻略

免费解锁Wand游戏修改器高级功能:开源增强工具Wand-Enhancer完整上手攻略 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/GitHub_Trending/we/Wand-Enhancer 先问你一个问…

2026/8/17 20:12:27 阅读更多 →
零基础玩转Obsidian日历插件:把日程、任务和笔记装进同一个仓库的完整指南

零基础玩转Obsidian日历插件:把日程、任务和笔记装进同一个仓库的完整指南

零基础玩转Obsidian日历插件:把日程、任务和笔记装进同一个仓库的完整指南 【免费下载链接】obsidian-full-calendar Keep events and manage your calendar alongside all your other notes in your Obsidian Vault. 项目地址: https://gitcode.com/gh_mirrors/o…

2026/8/17 20:11:26 阅读更多 →

日新闻

LabVIEW异步调用实战:从原理到生产者消费者模式,解决界面卡顿与并行处理难题

LabVIEW异步调用实战:从原理到生产者消费者模式,解决界面卡顿与并行处理难题

1. 项目概述:为什么异步调用是LabVIEW进阶的必修课? 如果你用LabVIEW做过稍微复杂点的项目,尤其是涉及界面响应、多任务并行或者硬件IO等待的场景,大概率遇到过这样的窘境:前面板点个按钮,整个程序就“卡死…

2026/8/17 0:00:08 阅读更多 →
LabVIEW异步调用实战:解决界面卡顿与并行处理难题

LabVIEW异步调用实战:解决界面卡顿与并行处理难题

1. 项目概述:为什么异步调用是LabVIEW进阶的必经之路如果你在LabVIEW里写过稍微复杂点的程序,尤其是涉及到界面响应、多任务并行或者硬件IO等待,大概率会遇到一个头疼的问题:程序“卡”住了。前面板点不动,进度条不更新…

2026/8/17 0:00:08 阅读更多 →
飞书局域网文件传输实战:3种方案实现高速点对点传输

飞书局域网文件传输实战:3种方案实现高速点对点传输

1. 项目概述:为什么要在局域网内用飞书传文件? 飞书作为一款主流的协同办公套件,其核心功能是围绕云端协作设计的。无论是文档、表格还是文件,通常的分享逻辑都是“上传到云端 -> 生成链接 -> 分享给同事”。这个流程在互联…

2026/8/17 0:00:08 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/17 2:58:27 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/17 2:58:30 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/17 2:58:32 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/17 18:54:37 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/17 18:55:16 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/17 18:55:55 阅读更多 →