news 2026/6/10 14:29:45

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

作者头像

张小明

前端开发工程师

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/6/10 14:13:48

如何用Vue-OrgChart快速构建企业级组织结构图:2025终极解决方案

在现代企业管理系统中&#xff0c;组织结构图的可视化展示已成为不可或缺的功能模块。无论是HR系统、项目管理平台还是企业OA系统&#xff0c;清晰的组织架构展示都能极大提升用户体验和系统专业性。然而&#xff0c;传统SVG图表库复杂难用、学习成本高的问题一直困扰着开发者。…

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

Docker镜像构建失败?一文掌握Vercel AI SDK版本兼容秘诀

第一章&#xff1a;Docker镜像构建失败&#xff1f;一文掌握Vercel AI SDK版本兼容秘诀在使用 Vercel AI SDK 构建基于 Docker 的应用时&#xff0c;开发者常遇到镜像构建失败的问题&#xff0c;其根源多与 SDK 版本和运行时环境的依赖冲突有关。确保版本兼容性是解决问题的关键…

作者头像 李华
网站建设 2026/6/10 13:44:05

量子计算镜像的运行参数调优实战(专家级参数设置指南)

第一章&#xff1a;量子计算镜像的运行参数概述在部署和运行量子计算模拟环境时&#xff0c;镜像的配置参数直接影响系统的稳定性与计算效率。合理的参数设置能够确保量子态叠加、纠缠模拟等核心功能正常执行&#xff0c;并最大限度利用底层硬件资源。核心运行参数说明 qubit_c…

作者头像 李华
网站建设 2026/6/10 3:21:51

【边缘 Agent 部署终极指南】:手把手教你编写高效 Docker 启动脚本

第一章&#xff1a;边缘 Agent 与 Docker 部署概述在现代分布式系统架构中&#xff0c;边缘 Agent 扮演着连接中心控制平台与终端设备的关键角色。它通常运行于资源受限的边缘节点&#xff0c;负责数据采集、本地决策、状态上报以及指令执行。为提升部署灵活性与环境隔离性&…

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

如何快速上手TabPFN:表格数据预测的终极AI解决方案

如何快速上手TabPFN&#xff1a;表格数据预测的终极AI解决方案 【免费下载链接】TabPFN Official implementation of the TabPFN paper (https://arxiv.org/abs/2207.01848) and the tabpfn package. 项目地址: https://gitcode.com/gh_mirrors/ta/TabPFN 在当今数据驱动…

作者头像 李华
网站建设 2026/6/10 3:08:29

为什么90%的团队都用错了智能Agent?Docker监控避坑指南

第一章&#xff1a;为什么90%的团队都用错了智能Agent&#xff1f;许多团队在引入智能Agent时&#xff0c;往往将其视为“自动化脚本”的升级版&#xff0c;忽略了其核心价值在于自主决策与环境感知能力。这种误解导致大量项目停留在任务编排层面&#xff0c;未能发挥Agent的学…

作者头像 李华