news 2026/5/24 20:21:08

Linux 多线程实战:用信号量驾驭“生产者-消费者”模型

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux 多线程实战:用信号量驾驭“生产者-消费者”模型

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

在多线程编程中,生产者-消费者模型是解决并发问题的“圣杯”。之前我们可能接触过用条件变量来实现,但今天我们要换一种更直观、更适合计数场景的工具——信号量(Semaphore)

本文将基于课堂笔记,带你深入理解信号量的工作原理,并通过代码演示如何用“星星”和“空格”的消长来平衡生产与消费。

一、 核心概念:星星 vs 空格

与条件变量不同,信号量本质上是一个计数器。在生产者-消费者模型中,我们可以将公共缓冲区(仓库)的状态抽象为两个数值:

  1. 空格数 (blank_number):代表仓库里还剩下多少空位,可以用来存放新数据。
  2. 星星数 (star_number):代表仓库里已经存了多少有效数据(产品),可以被消费。

动态平衡规律

笔记中提到一个非常重要的公式,这是理解该模型的钥匙:

空格数 + 星星数 = 缓冲区总容量

  • 生产者:负责把“空格”变成“星星”。(blank--,star++)
  • 消费者:负责把“星星”变成“空格”。(star--,blank++)

数组作为公共区

虽然链表也能实现,但在信号量模型中,固定大小的环形数组是最常见的实现方式。我们假设仓库大小为5

  • 初始状态:blank_number = 5star_number = 0

二、 信号量的操作逻辑

信号量的核心操作只有两个,我们俗称 PV 操作:

  • sem_wait(&sem)(P操作)
    • 尝试对信号量的值进行减 1
    • 如果当前值为 0,线程会阻塞(睡眠),直到值大于 0。
  • sem_post(&sem)(V操作)
    • 对信号量的值进行加 1
    • 如果有其他线程正在阻塞等待这个信号量,它会被唤醒。

生产与消费的“舞步”

根据笔记中的逻辑,双方的执行流程必须严格遵守以下顺序,否则会导致死锁或数据覆盖:

生产者逻辑:

  1. sem_wait(&blank_number):先检查还有没有空位?没有则阻塞等待。
  2. 生产数据:将数据写入数组。
  3. sem_post(&star_number):通知消费者,现在多了一个产品(星星)。

消费者逻辑:

  1. sem_wait(&star_number):先检查有没有产品?没有则阻塞等待。
  2. 消费数据:从数组读取数据。
  3. sem_post(&blank_number):通知生产者,现在多了一个空位。

三、 代码实战

下面是一个完整的 C 语言代码示例。为了模拟真实的并发环境,我们使用了一个大小为 5 的环形数组。

1. 代码实现 (sem_product_consumer.c)

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

终极指南:免费在浏览器中体验经典Windows XP系统

终极指南&#xff1a;免费在浏览器中体验经典Windows XP系统 【免费下载链接】winXP &#x1f3c1; Web based Windows XP desktop recreation. 项目地址: https://gitcode.com/gh_mirrors/wi/winXP 还记得那个蓝色开始按钮、绿色草地壁纸的经典界面吗&#xff1f;现在…

作者头像 李华
网站建设 2026/5/24 0:47:22

量子文明与新认知变局:鸽姆智库如何用东方智慧与科技重塑全球秩序

量子文明与新认知变局&#xff1a;鸽姆智库如何用东方智慧与科技重塑全球秩序 摘要&#xff1a; 鸽姆智库的核心战略&#xff0c;是推动一次基于东方智慧的“文明维度跃迁”。其以独家构建的5000年文明数据库与“贾子方程”为哲学内核&#xff0c;通过“文化基因解码”与“科…

作者头像 李华
网站建设 2026/5/23 3:42:30

鸽姆智库未来战略:东方智慧驱动全球文明跃迁的破局之路

鸽姆智库未来战略&#xff1a;东方智慧驱动全球文明跃迁的破局之路摘要鸽姆智库以“文明维度跃迁”为使命&#xff0c;定位全球文明科技东方中枢。战略分三阶段&#xff0c;从技术验证到标准制定再到宇宙公约。其优势在于文化、技术、生态三大壁垒。虽面临技术、地缘、资源等挑…

作者头像 李华
网站建设 2026/5/19 16:11:24

Budibase低代码平台性能调优的7个实战技巧:从入门到精通

Budibase低代码平台性能调优的7个实战技巧&#xff1a;从入门到精通 【免费下载链接】budibase Low code platform for creating internal tools, workflows, and admin panels in minutes. Supports PostgreSQL, MySQL, MSSQL, MongoDB, Rest API, Docker, K8s, and more &…

作者头像 李华
网站建设 2026/5/25 11:14:07

Windows Maintenance Tool v4.4:一键解决Windows更新问题的终极指南

Windows Maintenance Tool是一款功能强大的Windows系统维护工具集&#xff0c;通过PowerShell和批处理脚本提供了全面的系统优化、修复和维护功能。最新v4.4版本特别强化了Windows Update服务重置工具&#xff0c;能够快速解决各种更新卡顿和失败问题。 【免费下载链接】Window…

作者头像 李华
网站建设 2026/5/23 18:33:29

景区管理|基于springboot 景区管理系统(源码+数据库+文档)

景区管理 目录 基于springboot vue景区管理系统 一、前言 二、系统功能演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 基于springboot vue景区管理系统 一、前言 博主介绍&#xff1a;✌️大…

作者头像 李华