news 2026/5/12 0:50:16

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

作者头像

张小明

前端开发工程师

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/5/11 14:01:58

租用云盘VS自建NAS,你更倾向哪种方案?

最近小伙伴们在租用云盘和自建NAS两个方案之间真的纠结到不行&#xff0c;而这两种方案哪种更好呢&#xff1f; 其实它们并没有最好的存储资料的方案&#xff0c;只能说各有优势。 小白记得自从2015年前后&#xff0c;很多服务商云盘开始出现&#xff0c;而且势不可挡。但是到…

作者头像 李华
网站建设 2026/5/10 5:43:12

53、Windows 8磁盘驱动器和文件系统管理全攻略

Windows 8磁盘驱动器和文件系统管理全攻略 在Windows 8系统中,磁盘驱动器和文件系统的管理涉及多个重要方面,包括光盘刻录、ISO镜像操作、磁盘压缩与文件加密等。下面将详细介绍这些功能的使用方法和注意事项。 1. 光盘刻录方式 Windows 8支持两种光盘刻录方式:光盘制作(…

作者头像 李华
网站建设 2026/5/11 20:56:32

54、Windows系统文件安全与共享管理指南

Windows系统文件安全与共享管理指南 在使用Windows 8系统时,无论是处于域、工作组还是家庭组环境,文件安全和文件共享都是操作系统中至关重要的方面。这两者相互关联,难以单独讨论。文件安全通过限制访问来保护系统中的重要数据,而文件共享则允许其他用户访问这些数据。 …

作者头像 李华
网站建设 2026/5/10 10:32:15

Linly-Talker如何提升嘈杂环境下的语音合成抗干扰能力?

Linly-Talker如何提升嘈杂环境下的语音合成抗干扰能力&#xff1f; 在银行大厅的喧嚣中、机场广播的混响下&#xff0c;甚至工厂车间的机械轰鸣里&#xff0c;人们越来越期待与AI数字人进行自然流畅的对话。然而&#xff0c;现实世界的声学环境远比实验室复杂——背景噪声无处不…

作者头像 李华
网站建设 2026/5/9 9:25:01

Linly-Talker支持语音信号频谱分析

Linly-Talker 支持语音信号频谱分析 在虚拟主播24小时不间断直播、AI客服流畅应对千人千问的今天&#xff0c;我们正站在一个技术拐点上&#xff1a;数字人不再只是“会动的图片”&#xff0c;而是能听、会想、能说、表情自然的交互实体。这背后&#xff0c;是一整套精密协同的…

作者头像 李华
网站建设 2026/5/11 7:01:38

Linly-Talker与明略科技大模型系统对接方案

Linly-Talker与明略科技大模型系统对接方案 在企业数字化转型加速的今天&#xff0c;客户对交互体验的要求已不再满足于“能用”&#xff0c;而是追求“像人”——有温度、有表情、能听会说。传统的智能客服多停留在文字问答或机械语音播报阶段&#xff0c;缺乏情感表达和视觉反…

作者头像 李华