news 2026/6/9 22:28:13

实战:用信号量与环形缓冲区实现生产者-消费者模型

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
实战:用信号量与环形缓冲区实现生产者-消费者模型

各类资料学习下载合集
链接:https://pan.quark.cn/s/770d9387db5f

在多线程编程中,生产者-消费者模型是处理数据流的核心模式。上一篇我们讲了“条件变量+互斥锁”的实现方式,今天我们来解锁一种更轻量级的武器——信号量(Semaphore),并结合环形队列来实现高效的数据吞吐。


一、 核心蓝图:双信号量控制

在这个模型中,我们不再关注“互斥锁”来保护整个链表,而是关注资源的数量。我们把固定大小的缓冲区看作两类资源:

  1. 空格子(Blank):供生产者存放数据。
  2. 产品(Product):供消费者提取数据。

1. 信号量定义

我们引入两个信号量:

  • blank_number:表示缓冲区中剩余的空闲位置数量。初始值为NUM(例如 5)。
  • product_number:表示缓冲区中已有的产品数量。初始值为0

2. 环形队列(Ring Buffer)

为了避免频繁的内存分配与释放(如链表节点),我们使用一个固定大小的全局数组queue[NUM]。通过取模运算i = (i + 1) % NUM,让数组下标首尾相接,形成一个环。


二、 生产者实现逻辑

生产者的任务是将数据填入空格子。它的逻辑可以概括为:“申请空格 -> 生产 -> 增加产品”

  1. 等待空格 (sem_wait(&blank_number))
    • blank_number减 1。
    • 如果blank_number为 0(说明缓冲区满了),生产者自动阻塞,等待消费者腾出位置。
  2. 生产产品
    • 将数据写入数组当前位置queue[p]
    • 移动下标p = (p + 1) % NUM
  3. 增加产品 (sem_post(&product_number))
    • product_number加 1。
    • 唤醒可能正在等待产品的消费者。

三、 消费者实现逻辑

消费者的任务是取走产品并腾出空间。它的逻辑概括为:“申请产品 -> 消费 -> 增加空格”

  1. 等待产品 (sem_wait(&product_number))
    • product_number减 1。
    • 如果product_number为 0(说明缓冲区空了),消费者自动阻塞,等待生产者产出。
  2. 消费产品
    • 读取数组当前位置queue[c]的数据。
    • 移动下标c = (c + 1) % NUM
    • (可选)将原位置清零queue[c] = 0,模拟消费动作。
  3. 增加空格 (sem_post(&blank_number))
    • blank_number加 1。
    • 唤醒可能正在等待空格的生产者。

四、 完整代码实现

下面的代码展示了如何使用semaphore.h实现上述逻辑。我们定义缓冲区大小为 5。

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

Linly-Talker在水务集团缴费指导中的部署经验

Linly-Talker在水务集团缴费指导中的部署经验 在城市公共服务数字化转型的浪潮中&#xff0c;水务集团正面临一个普遍而棘手的问题&#xff1a;每年数百万次的用户来电咨询集中在“如何查账单”“逾期怎么处理”这类基础问题上&#xff0c;人工坐席不堪重负&#xff0c;服务响应…

作者头像 李华
网站建设 2026/6/6 22:17:22

Linly-Talker在图书馆智能导览机器人中的应用

Linly-Talker在图书馆智能导览机器人中的应用 在一座现代化的图书馆里&#xff0c;一位读者驻足于大厅中央的交互终端前。他轻声问道&#xff1a;“我想找一本关于人工智能的入门书&#xff0c;最近有什么推荐吗&#xff1f;”屏幕上的虚拟导览员微微一笑&#xff0c;眼神自然转…

作者头像 李华
网站建设 2026/6/9 11:38:40

Linly-Talker生成视频的CMYK色彩空间转换注意事项

Linly-Talker生成视频的CMYK色彩空间转换注意事项 在虚拟主播、AI客服和智能教育日益普及的今天&#xff0c;Linly-Talker 这类端到端数字人系统正快速成为内容创作的核心工具。它能基于一张人脸照片&#xff0c;结合大语言模型与语音合成技术&#xff0c;实时驱动口型与表情&a…

作者头像 李华
网站建设 2026/6/9 21:10:44

33、网络基础设施监控与管理:Windows Server更新服务指南

网络基础设施监控与管理:Windows Server更新服务指南 1. 网络基础设施管理概述 在网络环境中,IT团队承担着多项关键任务,以确保网络的高效运行和系统的稳定。其中,保持系统更新、网络数据收集、事件日志监控、性能数据捕获、打印服务和影子复制服务配置以及备份恢复等工作…

作者头像 李华
网站建设 2026/6/8 0:32:26

Linly-Talker可定制化方案:品牌专属数字人形象设计流程

Linly-Talker可定制化方案&#xff1a;品牌专属数字人形象设计流程 在电商直播间里&#xff0c;一个穿着企业制服、声音亲切的虚拟主播正流畅地介绍新品&#xff1b;在教育平台上&#xff0c;一位由教师照片生成的“AI讲师”正在逐字讲解数学题&#xff1b;在银行客服界面中&am…

作者头像 李华
网站建设 2026/6/9 18:43:19

AI健身教练原型开发:基于Linly-Talker的动作指导系统

AI健身教练原型开发&#xff1a;基于Linly-Talker的动作指导系统 在智能健康设备日益普及的今天&#xff0c;人们不再满足于简单的运动计数和心率监测。越来越多的用户希望获得专业、实时且个性化的动作指导——就像身边有一位全天候在线的私人教练。然而&#xff0c;真人教练成…

作者头像 李华