news 2026/7/22 10:15:30

单片机开发进阶技巧:(三)生产者-消费者模型

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
单片机开发进阶技巧:(三)生产者-消费者模型
上一篇下一篇
如何判断一个浮点型运算结果是否为整数

目 录

  • 生产者-消费者模型
    • 1)定义
    • 2)核心同步问题
    • 3)实现方式
      • 3.1)基于信号量的经典方案
      • 3.2)在 RTOS 中(如 FreeRTOS)
    • 4)实际工作中常见的应用场景
    • 5)总结

生产者-消费者模型

1)定义

生产者-消费者模型 是并发编程中最经典的设计模式之一,用于解决多线程/多进程之间数据传递与协作的问题。

  • 生产者(Producer):负责生成数据(比如传感器采集、网络接收、文件读取)。
  • 消费者(Consumer):负责处理数据(比如计算、显示、存储、转发)。
  • 共享缓冲区(Buffer):一个固定大小的队列或环形缓冲区,生产者把数据放进去,消费者从里面取出来。

三者关系:[生产者] —(写入)—> [共享缓冲区] —(读取)—> [消费者]

为什么需要这个模型?

好处说明
解耦生产者和消费者互不依赖,可以独立变化
平衡速度差异生产者快、消费者慢时,数据暂存缓冲区,不会丢失或阻塞
异步处理生产者在产生数据后不必等消费者处理完,可以立刻去做下一件事
支持并发多个生产者和多个消费者可以同时工作

2)核心同步问题

共享缓冲区是临界资源,需要解决两个问题:

问题描述典型解决方式
互斥同一时刻只能有一个线程修改缓冲区互斥锁(mutex)
同步缓冲区满时生产者必须等待,缓冲区空时消费者必须等待信号量(semaphore)

3)实现方式

3.1)基于信号量的经典方案

// 假设有一个长度为 N 的环形缓冲区sem_tempty_slots;// 初始值为 N(空位数)sem_tfilled_slots;// 初始值为 0(已填数据数)mutex_tbuffer_mutex;// 保护缓冲区操作voidproducer(){while(1){item=produce_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);item=remove_item();// 取出缓冲区mutex_unlock(&buffer_mutex);sem_post(&empty_slots);// 通知有空位consume_item(item);}}

3.2)在 RTOS 中(如 FreeRTOS)

通常会用消息队列(Queue)直接实现,队列本身已经内置了互斥和同步机制:

QueueHandle_t xQueue=xQueueCreate(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
网络包处理网卡驱动接收数据协议栈线程(LwIP)pbuf 链表 / 队列
传感器数据采集定时器中断采集 ADC数据处理/上传线程双缓冲或队列

5)总结

生产者消费者模型就是通过一个共享的缓冲区,把“生产数据”和“消费数据”两个动作分开,让它们可以并发、异步地执行,并利用互斥和同步机制保证数据安全与流程协调


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/22 10:10:41

《倒像》预告片技术解析:低成本短片创作的视觉语言与制作实践

这次我们来看一个值得关注的青年电影创作项目——第二十届FIRST青年电影展主竞赛入围剧情短片《倒像》的预告片。作为国内最具影响力的青年电影平台,FIRST影展每年都会涌现出一批具有实验性和作者性的优质短片作品,而《倒像》作为本届主竞赛单元的入围作…

作者头像 李华
网站建设 2026/7/22 10:10:34

嵌入式Linux驱动开发面试20问与实战解析

1. 嵌入式Linux驱动面试题精选与解析 作为一名在嵌入式领域摸爬滚打多年的工程师,我深知Linux驱动开发是面试中最容易"翻车"的环节。记得我第一次面试驱动岗位时,被问到"为什么字符设备需要实现file_operations结构体"直接语塞。今天…

作者头像 李华
网站建设 2026/7/22 10:10:00

解决Android进程保活挑战的KeepAlive技术革新方案

解决Android进程保活挑战的KeepAlive技术革新方案 【免费下载链接】KeepAlive Fighting against force-stop kill process on Android with binder ioctl / Android高级保活 项目地址: https://gitcode.com/gh_mirrors/ke/KeepAlive 在Android应用开发领域,进…

作者头像 李华
网站建设 2026/7/22 10:09:13

Unity UIEffect:替代粒子系统,实现高性能UI特效的实战指南

1. 项目概述:从粒子特效到UIEffect的效能革命在移动端Unity项目里做UI特效,尤其是全屏过渡、按钮高光、面板模糊这类需求,估计不少朋友第一反应就是上粒子系统。我以前也这么干,觉得Particle System功能强大,效果酷炫&…

作者头像 李华
网站建设 2026/7/22 10:05:32

Unity 3D手游开发入门:从环境搭建到性能优化的完整指南

1. 从零到一:为什么选择Unity作为你的3D手游起点? 如果你正盯着手机屏幕上那些画面炫酷、玩法多样的3D游戏,心里琢磨着“我能不能也做一个?”,那么Unity几乎是你绕不开的答案。这不是一句空话,而是过去十多…

作者头像 李华