news 2026/6/15 22:20:00

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

作者头像

张小明

前端开发工程师

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/6/16 16:19:13

宝可梦自动修改插件:让你的PKHeX实现智能合规化

宝可梦自动修改插件:让你的PKHeX实现智能合规化 【免费下载链接】PKHeX-Plugins Plugins for PKHeX 项目地址: https://gitcode.com/gh_mirrors/pk/PKHeX-Plugins 还在为手动调整宝可梦数据而烦恼吗?宝可梦自动修改插件正是你需要的解决方案&…

作者头像 李华
网站建设 2026/6/15 0:36:27

Docker与Vercel AI SDK版本匹配全攻略(专家级配置方案)

第一章:Docker与Vercel AI SDK版本匹配的核心挑战在现代全栈AI应用部署中,将 Vercel AI SDK 集成至 Docker 容器环境已成为常见实践。然而,由于 Vercel AI SDK 依赖特定版本的 Node.js 运行时与异步处理机制,而 Docker 镜像的基础…

作者头像 李华
网站建设 2026/6/16 3:01:40

Docker网络隔离难题全解析,攻克多模态Agent跨容器通信痛点

第一章:多模态 Agent 的 Docker 网络隔离在构建多模态 Agent 系统时,确保各个服务模块(如语音识别、图像处理、自然语言理解等)之间的网络隔离至关重要。Docker 提供了灵活的网络模型,允许通过自定义网络实现容器间的逻…

作者头像 李华
网站建设 2026/6/16 12:00:21

为什么顶尖团队都在用Docker Buildx压缩镜像?真相令人震惊

第一章:为什么顶尖团队都在用Docker Buildx压缩镜像?在现代云原生开发中,构建轻量、安全且跨平台兼容的容器镜像是提升部署效率的关键。Docker Buildx 作为 Docker 官方推荐的高级构建工具,正被越来越多顶尖技术团队广泛采用&…

作者头像 李华
网站建设 2026/6/15 22:32:01

计算机毕设java的高校器材管理系统的设计与实现 基于Java技术的高校设备管理平台开发与应用 Java环境下高校器材管理系统的构建与实现

计算机毕设java的高校器材管理系统的设计与实现lv3349 (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。随着高校规模的不断扩大和教学资源的日益丰富,器材管理成为高校…

作者头像 李华
网站建设 2026/6/14 22:44:34

如何避免Docker容器崩溃?深入解析Vercel AI SDK版本依赖

第一章:Docker 与 Vercel AI SDK 的版本适配在构建现代生成式 AI 应用时,使用 Docker 容器化部署结合 Vercel AI SDK 已成为常见实践。然而,不同版本的 Vercel AI SDK 与底层运行环境之间可能存在兼容性问题,尤其是在 Node.js 版本…

作者头像 李华