news 2026/7/7 9:10:33

手把手教你实现生产者-消费者模型(条件变量版)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
手把手教你实现生产者-消费者模型(条件变量版)

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

生产者-消费者模型是多线程编程的“Hello, World!”,也是面试中的高频考点。本文将提供一份“食谱级”的详细指南,带你一步一步、从零开始,使用互斥锁和条件变量构建一个健壮的生产者-消费者模型。


一、 准备工作:定义共享资源与同步工具

在开始烹饪前,我们先准备好“食材”和“厨具”。

  • “食材” (共享资源):我们用一个链表作为公共缓冲区。
    // 产品节点structmsg{intnum;structmsg*next;};// 缓冲区头指针structmsg*head=NULL;
  • “厨具” (同步工具):一个互斥锁和一个条件变量。
    // 互斥锁,保护对 head 的访问pthread_mutex_tmutex=PTHREAD_MUTEX_INITIALIZER;// 条件变量,用于在“有产品”时通知消费者pthread_cond_thas_product=PTHREAD_COND_INITIALIZER;

二、 消费者实现流程 (六步法)

消费者的逻辑是“等待食材,然后加工”。下面我们分六步来实现它。

第一步:创建并初始化锁

这一步在全局范围内完成,如上面的“准备工作”所示。我们通过PTHREAD_MUTEX_INITIALIZER宏静态初始化了mutexhas_product

第二步:加锁

在检查缓冲区(链表)之前,必须先获取锁,以防止其他线程同时修改它。

// consumer a.cvoid*consumer(void*arg){while(1){pthread_mutex_lock(&mutex);// <-- 第二步:加锁// ...}}

第三步:判断条件与等待

这是最核心的步骤。如果缓冲区为空 (head == NULL),消费者就需要等待。

// consumer b.cwhile(head==NULL){// <-- 第三步:循环判断条件// 调用 wait 函数,它会原子性地完成三件事:// 1. 阻塞当前线程// 2. 解锁 mutex// 3. 被唤醒后,重新加锁 mutexpthread_cond_wait(&has_product,&mutex);}

重点wait函数的内部机制是关键。它自动解锁,让生产者有机会进入临界区;被唤醒后又自动加锁,确保后续操作的线程安全。

第四步:访问公共区数据

wait函数返回后,线程必然持有锁,并且条件(理论上)已满足。此时可以安全地从缓冲区取数据。

// consumer c.c// (此时已持有锁)structmsg*mp=head;head=mp
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/7 14:21:47

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

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

作者头像 李华
网站建设 2026/7/7 9:05:13

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

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

作者头像 李华
网站建设 2026/7/7 16:41:59

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

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

作者头像 李华
网站建设 2026/7/7 15:08:00

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

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

作者头像 李华
网站建设 2026/7/7 5:26:30

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

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

作者头像 李华
网站建设 2026/7/7 17:37:00

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

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

作者头像 李华