news 2026/5/10 13:45:29

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

作者头像

张小明

前端开发工程师

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/7 9:21:41

从入门到精通:Docker MCP 网关协议转换的8个核心技术点

第一章&#xff1a;Docker MCP 网关协议转换概述 在现代微服务架构中&#xff0c;不同组件之间常使用多种通信协议&#xff0c;如 HTTP、gRPC、MQTT 等。Docker MCP&#xff08;Microservice Communication Protocol&#xff09;网关作为服务间通信的核心枢纽&#xff0c;承担着…

作者头像 李华
网站建设 2026/5/8 18:10:10

【AI开发者必藏】Docker与Vercel AI SDK集成部署:5步完成生产级发布

第一章&#xff1a;Docker与Vercel AI SDK集成部署概述随着生成式AI应用的快速发展&#xff0c;开发者需要更高效的部署方案来快速上线AI驱动的服务。Docker与Vercel AI SDK的结合为这一需求提供了强大支持&#xff1a;Docker确保开发、测试与生产环境的一致性&#xff0c;而Ve…

作者头像 李华
网站建设 2026/5/7 13:08:01

手把手教你部署AI模型,Docker容器化技巧全解析

第一章&#xff1a;AI模型容器化部署概述随着人工智能技术的广泛应用&#xff0c;如何高效、稳定地将训练好的AI模型部署到生产环境成为关键挑战。容器化技术凭借其轻量、可移植和环境隔离的特性&#xff0c;成为AI模型部署的理想选择。通过将模型、依赖库、运行时环境打包进容…

作者头像 李华
网站建设 2026/5/7 8:11:52

FastAPI 请求验证:超越 Pydantic 基础,构建企业级验证体系

FastAPI 请求验证&#xff1a;超越 Pydantic 基础&#xff0c;构建企业级验证体系 引言&#xff1a;为什么需要超越基础的请求验证&#xff1f; 在现代 API 开发中&#xff0c;请求验证远不止是检查数据类型是否正确。随着系统复杂性的增加&#xff0c;我们需要处理更复杂的验证…

作者头像 李华
网站建设 2026/4/29 2:50:10

【量子计算镜像参数配置黄金法则】:3步实现稳定高效运行

第一章&#xff1a;量子计算镜像参数配置的核心概念在量子计算系统中&#xff0c;镜像参数配置是确保量子态稳定映射与操作精度的关键环节。该配置涉及对量子门、纠缠源及测量基的虚拟化建模&#xff0c;使其能够在经典仿真环境中准确反映真实硬件行为。镜像参数的基本构成 量子…

作者头像 李华
网站建设 2026/4/29 0:06:14

AI模型Docker容器化部署(从入门到生产级落地)

第一章&#xff1a;AI模型Docker容器化部署概述在现代人工智能应用开发中&#xff0c;将训练好的AI模型高效、稳定地部署到生产环境是关键环节。Docker容器化技术凭借其轻量、可移植和环境隔离的特性&#xff0c;成为AI模型部署的首选方案。通过容器化&#xff0c;开发者可以将…

作者头像 李华