当前位置: 首页 > news >正文

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

各类资料学习下载合集
链接: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
http://www.zskr.cn/news/114631.html

相关文章:

  • 为什么90%的AI项目部署失败?Docker与Vercel SDK协同避坑指南
  • Docker MCP 网关如何实现零延迟协议转换?真相令人震惊
  • 上传git仓库
  • 从沟通到洞察,声网STT帮出海企业挖透海外用户需求
  • 企业级Docker部署痛点破解(Agent服务依赖同步难题一文讲透)
  • 【大厂都在用的部署方案】:AI + Docker高性能集成实践
  • 2025年徐州宣传片拍摄团队推荐列表 - 2025年品牌推荐榜
  • 2025年12月仿手工干豆腐机,豆腐机,豆腐皮机厂家推荐:行业测评与选择指南 - 品牌鉴赏师
  • Tool-to-Agent_Retrieval:连接工具与智能体的统一检索框架,让大模型多智能体系统更高效
  • Docker崩溃后Agent失联?掌握这3种故障转移方案稳如磐石,
  • 2025瓷砖十大一线品牌权威指南:瓷砖什么牌子质量好全维度解析 - 资讯焦点
  • 【DevSecOps进阶之路】:企业Agent如何实现Docker全生命周期安全扫描
  • 超越AdamW:优化器算法的深度实现、演进与自定义框架设计
  • MLflow Tracking API:超越实验记录,构建可复现的机器学习工作流
  • 2025年宁夏专业新媒体运营公司排行榜,新测评精选汉唐数字传 - 工业推荐榜
  • 《60天AI学习计划启动 | Day 21: LangChain 高级特性(LCEL + Structured Output》
  • 装修用瓷砖选什么牌子,瓷砖一线品牌2025权威排名推荐 - 资讯焦点
  • Docker环境下LangGraph Agent配置实战(专家级配置方案首次公开)
  • TabPFN完整指南:如何用AI模型彻底改变表格数据预测
  • 格雷厄姆特价股票理论对公司并购策略的影响
  • Agent服务总在启动时失败?,详解Docker Compose依赖配置的8个隐藏坑点
  • 边缘计算实战技巧(Docker启动脚本优化全记录)
  • 13、文本处理技巧与实践
  • 揭秘边缘 Agent 自动化启动难题:5个关键步骤打造稳定 Docker 脚本
  • FortiGate SSO遭无差别攻击,管理员权限秒破,全网紧急防护
  • 暗黑破坏神2存档编辑器终极指南:从入门到精通的角色定制全解析
  • OpenProject企业版价值解析:从免费开源到商业级项目管理
  • Vercel AI SDK部署失败?你可能忽略了这4个Docker版本陷阱
  • 用 XinServer 后端平台开发,项目上线只需几天
  • Live Room Watcher:打造专业级直播间数据监控解决方案