news 2026/5/26 6:13:23

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

作者头像

张小明

前端开发工程师

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/5/24 9:13:20

Blender建筑生成插件终极指南:高效参数化建模方案

Blender建筑生成插件终极指南&#xff1a;高效参数化建模方案 【免费下载链接】building_tools Building generation addon for blender 项目地址: https://gitcode.com/gh_mirrors/bu/building_tools 还在为复杂的建筑建模而烦恼吗&#xff1f;建筑生成插件正是你需要的…

作者头像 李华
网站建设 2026/5/25 21:23:14

【Docker镜像安全扫描全攻略】:揭秘Docker Scout最佳扫描频率与实践策略

第一章&#xff1a;Docker Scout镜像扫描频率的核心价值Docker Scout 是现代容器安全体系中的关键组件&#xff0c;其核心功能之一是持续对容器镜像进行漏洞扫描。扫描频率的设定直接影响到组织对安全威胁的响应速度与风险暴露窗口的长短。高频扫描能够及时发现新披露的漏洞&am…

作者头像 李华
网站建设 2026/5/25 12:09:58

Agent服务与Docker隔离冲突频发?掌握这4种方案立刻提升系统稳定性

第一章&#xff1a;Agent服务的Docker环境隔离在构建分布式系统时&#xff0c;Agent服务常作为边缘节点与核心平台通信的关键组件。为确保其运行环境的一致性与安全性&#xff0c;采用Docker进行环境隔离成为标准实践。通过容器化技术&#xff0c;每个Agent实例可在独立的用户空…

作者头像 李华
网站建设 2026/5/25 23:15:01

扫描频率决定安全性?,深度解析Docker Scout自动扫描机制与风险盲区

第一章&#xff1a;扫描频率决定安全性&#xff1f;Docker Scout镜像扫描机制初探Docker Scout 是 Docker 官方推出的一项安全分析工具&#xff0c;旨在帮助开发者和运维团队在构建和部署阶段识别容器镜像中的已知漏洞、配置风险和软件供应链威胁。其核心机制是通过集成多个漏洞…

作者头像 李华
网站建设 2026/5/26 4:10:11

Docker崩溃后Agent失联?掌握这3种故障转移方案稳如磐石,

第一章&#xff1a;Docker崩溃后Agent失联&#xff1f;掌握这3种故障转移方案稳如磐石当运行在容器中的Agent因底层Docker服务崩溃而失联时&#xff0c;系统可用性面临严峻挑战。为确保服务连续性&#xff0c;需提前设计可靠的故障转移机制。以下是三种经过验证的应对策略。使用…

作者头像 李华
网站建设 2026/5/25 13:48:42

【花雕学编程】Arduino BLDC 之智能小车避障路径规划

在基于 Arduino 的无刷直流电机&#xff08;BLDC&#xff09;驱动智能小车系统中&#xff0c;实现避障与路径规划是提升其自主导航能力的关键环节。虽然 Arduino 平台计算资源有限&#xff0c;但通过合理的软硬件协同设计&#xff0c;仍可构建一套轻量、高效、实用的避障路径规…

作者头像 李华