news 2026/7/29 10:52:21

代码逐行解析:用链表和条件变量实现生产者-消费者模型

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
代码逐行解析:用链表和条件变量实现生产者-消费者模型

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

在前面的学习中,我们掌握了生产者-消费者模型的理论基础和条件变量的核心功能。现在,是时候将理论付诸实践了!本文将通过一个约 70 行的完整 C 语言代码示例,逐行分析如何使用链表、互斥锁和条件变量,构建一个健壮的生产者-消费者模型。


一、 蓝图设计:共享数据与同步机制

在动手写代码之前,我们先规划好模型的“骨架”。

1. 共享数据结构

我们将使用一个链表来模拟可以无限增长的“公共区”(缓冲区)。

// 链表节点,代表一个“产品”structmsg{intnum;structmsg*next;};// 全局头指针,指向链表的第一个产品structmsg*head=NULL;

2. 同步机制

我们需要两种工具来保证线程安全和同步:

  • 互斥锁 (Mutex):保护对全局头指针head的访问,确保链表操作的原子性。
  • 条件变量 (Condition Variable):用于线程间的通信,当链表为空时,通知消费者“等待”;当新产品加入时,通知消费者“开工”。

我们将使用静态初始化的方式来定义它们,这种方式代码简洁,适用于全局变量。

// 静态初始化互斥锁pthread_mutex_tlock=PTHREAD_MUTEX_INITIALIZER;// 静态初始化条件变量,代表“有产品”这个条件pthread_cond_thas_product=PTHREAD_COND_INITIALIZER;

二、 消费者函数 (consumer) 深度分析

消费者的任务是:当有产品时,从链表中取出并消费;没有产品时,则等待。

void*consumer(void*arg){structmsg*mp;while(1){// 1. 加锁,准备访问共享链表pthread_mutex_lock(&lock);// 2. 核心:使用 while 循环检查条件while(head==NULL){printf("--- [消费者] 链表为空, 等待产品...\n");// 3. 等待条件满足// 该函数会原子性地:①解锁lock ②阻塞线程 ③被唤醒后重新加锁lockpthread_cond_wait(&has_product,&lock);}// 4. 条件满足,消费数据(代码执行到这里,必然持有锁)mp=head;head=mp->next;// 摘除头节点printf("=== [消费者] 消费数据: %d\n",mp->num);// 5. 解锁,让其他线程可以访问链表pthread_mutex_unlock(&lock
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/29 10:07:52

Blender建筑生成插件终极指南:高效参数化建模方案

Blender建筑生成插件终极指南:高效参数化建模方案 【免费下载链接】building_tools Building generation addon for blender 项目地址: https://gitcode.com/gh_mirrors/bu/building_tools 还在为复杂的建筑建模而烦恼吗?建筑生成插件正是你需要的…

作者头像 李华
网站建设 2026/7/29 10:33:10

【Docker镜像安全扫描全攻略】:揭秘Docker Scout最佳扫描频率与实践策略

第一章:Docker Scout镜像扫描频率的核心价值Docker Scout 是现代容器安全体系中的关键组件,其核心功能之一是持续对容器镜像进行漏洞扫描。扫描频率的设定直接影响到组织对安全威胁的响应速度与风险暴露窗口的长短。高频扫描能够及时发现新披露的漏洞&am…

作者头像 李华
网站建设 2026/7/28 14:56:39

Agent服务与Docker隔离冲突频发?掌握这4种方案立刻提升系统稳定性

第一章:Agent服务的Docker环境隔离在构建分布式系统时,Agent服务常作为边缘节点与核心平台通信的关键组件。为确保其运行环境的一致性与安全性,采用Docker进行环境隔离成为标准实践。通过容器化技术,每个Agent实例可在独立的用户空…

作者头像 李华
网站建设 2026/7/28 16:54:05

扫描频率决定安全性?,深度解析Docker Scout自动扫描机制与风险盲区

第一章:扫描频率决定安全性?Docker Scout镜像扫描机制初探Docker Scout 是 Docker 官方推出的一项安全分析工具,旨在帮助开发者和运维团队在构建和部署阶段识别容器镜像中的已知漏洞、配置风险和软件供应链威胁。其核心机制是通过集成多个漏洞…

作者头像 李华
网站建设 2026/7/29 8:27:38

Docker崩溃后Agent失联?掌握这3种故障转移方案稳如磐石,

第一章:Docker崩溃后Agent失联?掌握这3种故障转移方案稳如磐石当运行在容器中的Agent因底层Docker服务崩溃而失联时,系统可用性面临严峻挑战。为确保服务连续性,需提前设计可靠的故障转移机制。以下是三种经过验证的应对策略。使用…

作者头像 李华
网站建设 2026/7/28 4:14:27

【花雕学编程】Arduino BLDC 之智能小车避障路径规划

在基于 Arduino 的无刷直流电机(BLDC)驱动智能小车系统中,实现避障与路径规划是提升其自主导航能力的关键环节。虽然 Arduino 平台计算资源有限,但通过合理的软硬件协同设计,仍可构建一套轻量、高效、实用的避障路径规…

作者头像 李华