news 2026/2/6 5:18:19

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

作者头像

张小明

前端开发工程师

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/2/3 1:13:21

AI主播背后的技术支撑:揭秘EmotiVoice情感合成能力

AI主播背后的技术支撑&#xff1a;揭秘EmotiVoice情感合成能力 在虚拟偶像直播中突然落泪&#xff0c;在有声书里用颤抖的声音讲述离别&#xff0c;或是以轻快语调即兴回应观众夸奖——这些曾属于人类专属的“情绪表达”&#xff0c;如今正被AI悄然复现。语音不再只是信息的载体…

作者头像 李华
网站建设 2026/2/5 19:14:31

MLflow Tracking API:超越实验记录,构建可复现的机器学习工作流

MLflow Tracking API&#xff1a;超越实验记录&#xff0c;构建可复现的机器学习工作流 引言&#xff1a;为什么我们需要超越简单的实验记录&#xff1f; 在机器学习项目的生命周期中&#xff0c;最令人头痛的问题之一就是实验管理的混乱。你是否曾经历过以下场景&#xff1a…

作者头像 李华
网站建设 2026/2/4 19:48:13

毕设 深度学习yolo藻类细胞检测识别(科研辅助系统)(源码+论文)

文章目录0 前言1 项目运行效果2 课题背景2.1 水环境监测的重要性2.2 传统检测方法的局限性2.3 技术发展趋势2.4 项目研究价值2.5 国内外研究现状2.5.1 国际进展2.5.2 国内现状2.6 技术挑战3 设计框架3.1 整体架构图3.2 技术栈组成3.3 模型训练模块3.3.1 数据处理流程3.3.2 训练…

作者头像 李华
网站建设 2026/2/3 1:13:30

Docker Buildx你真的会用吗?10个镜像压缩最佳实践曝光

第一章&#xff1a;Docker Buildx镜像压缩的认知革命传统的 Docker 镜像构建方式往往生成体积庞大、冗余严重的镜像&#xff0c;不仅占用存储空间&#xff0c;还影响部署效率。Docker Buildx 的出现彻底改变了这一局面&#xff0c;它基于 BuildKit 构建引擎&#xff0c;支持多平…

作者头像 李华
网站建设 2026/2/5 4:36:04

【Docker监控效率提升300%】:智能Agent部署与告警阈值优化秘籍

第一章&#xff1a;智能Agent驱动的Docker监控新范式传统Docker监控依赖于静态指标采集与轮询机制&#xff0c;难以应对动态容器环境中的实时异常检测与资源调度需求。随着AI与可观测性技术的融合&#xff0c;基于智能Agent的监控方案正成为新的行业标准。这类Agent以内嵌或侧车…

作者头像 李华