《Linux从练气到飞升》No.29 生产者消费者模型

🕺作者: 主页

我的专栏
C语言从0到1
探秘C++
数据结构从0到1
探秘Linux
菜鸟刷题集

😘欢迎关注:👍点赞🙌收藏✍️留言

🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的很重要,有问题可在评论区提出,感谢阅读!!!

文章目录

    • 前言
    • 1 相关概念
    • 2 基于BlockingQueue的生产者消费者代码实现

前言

在并发编程领域,生产者消费者模型是一个经典且重要的话题。它涉及到多线程之间的协作与通信,展现了在复杂系统中保持数据一致性和避免资源竞争的关键技术。通过深入探讨生产者消费者模型,我们可以了解如何利用同步和互斥的机制来实现线程之间的有效协作,从而提高程序的效率和可靠性。

在本篇博客中,我将带领读者逐步理解生产者消费者模型的设计思想、实现方法以及可能遇到的问题。无论是初学者还是有一定经验的开发人员,都可以通过本文深入了解生产者消费者模型,并掌握如何在实际项目中应用这一模型来优化程序结构和性能。

让我们一起探索生产者消费者模型的精妙之处,为并发编程的世界增添新的活力与智慧。

1 相关概念

  1. 321原则

3:3种关系,生产者之间(互斥)、消费者之间(互斥)、生产者和消费者之间(互斥+同步)
2:两种角色,生产者和消费者
1:一个交易场所

  1. 使用生产者消费者模型的原因

生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。这个阻塞队列就是用来给生产者和消费者解耦的。

  1. 生产者消费者模型优点
  1. 解耦
  2. 支持并发
  3. 支持忙闲不均

image.png

  1. 基于BlockingQueue的生产者消费者模型

在多线程编程中阻塞队列(Blocking Queue)是一种常用于实现生产者和消费者模型的数据结构。
其与普通的队列区别在于,当队列为空时,从队列获取元素的操作将会被阻塞,直到队列中被放入了元素;当队列满时,往队列里存放元素的操作也会被阻塞,直到有元素被从队列中取出(以上的操作都是基于不同的线程来说的,线程在对阻塞队列进程操作时会被阻塞)
image.png

2 基于BlockingQueue的生产者消费者代码实现

BlockQueue.cc

#pragma#include<iostream>
#include<pthread.h>
#include<unistd.h>
#include<queue>
#include<stdlib.h>
using namespace std;class Task
{
public:int _x;int _y;Task(){}Task(int x,int y):_x(x),_y(y){}int run(){return _x+_y;}~Task(){}
};class BlockQueue
{
private:/* data */std::queue<Task> q;//设置一个队列int _cap;//容量pthread_mutex_t lock;//设置一把互斥锁pthread_cond_t c_cond;//满了通知消费者pthread_cond_t p_cond;//满了通知生产者void LockQueue()//加锁{pthread_mutex_lock(&lock);}void UnlockQueue()//解锁{pthread_mutex_unlock(&lock);}bool IsEmpty()//判断队列是否为空{return q.size()==0;}bool IsFull()//判断队列是否满{return q.size()==_cap;}void ProductWait()//生产者等待{pthread_cond_wait(&p_cond,&lock);}void ConsumerWait()//消费者等待{pthread_cond_wait(&c_cond,&lock);}void WakeUpProduct()//唤醒生产者{pthread_cond_signal(&p_cond);}void WakeUpConsumer()//唤醒消费者{pthread_cond_signal(&c_cond);}
public:BlockQueue(int cap)//初始化:_cap(cap){pthread_mutex_init(&lock,NULL);pthread_cond_init(&c_cond,NULL);pthread_cond_init(&p_cond,NULL);}~BlockQueue(){pthread_mutex_destroy(&lock);pthread_cond_destroy(&c_cond);pthread_cond_destroy(&p_cond);}void put(Task in){LockQueue();while(IsFull()){WakeUpConsumer();//唤醒消费者std::cout<<"queue full,notify consume , stop product"<<std::endl;ProductWait();//生产者线程等待}q.push(in);UnlockQueue();}void get(Task&out){LockQueue();while(IsEmpty()){WakeUpProduct();//唤醒生产者std::cout<<"queue Empty,notify product , stop consum"<<std::endl;ConsumerWait();//消费者线程等待}out=q.front();q.pop();UnlockQueue();}};

main.cc

#include"BlockQueue.cc"pthread_mutex_t p_lock;
pthread_mutex_t c_lock;void* Product_Run(void* arg)
{BlockQueue* bq = (BlockQueue*)arg;srand((unsigned int)time(NULL));while(1){pthread_mutex_lock(&p_lock);int x = rand()%10 + 1;int y = rand()%100 + 1;Task t(x,y);bq->put(t);pthread_mutex_unlock(&p_lock);cout<<"product data is "<<t.run()<<endl;}
}void* Consumer_Run(void* arg)
{BlockQueue* bq = (BlockQueue*)arg;srand((unsigned int)time(NULL));while(1){pthread_mutex_lock(&c_lock);Task t;bq->get(t);pthread_mutex_unlock(&c_lock);cout<<"consumer is "<<t._x<<"+"<<t._y<<"="<<t.run()<<endl;sleep(1);}
}
int main()
{BlockQueue* bq = new BlockQueue(10);pthread_t c,p;pthread_create(&c,NULL,Product_Run,(void*)bq);pthread_create(&p,NULL,Consumer_Run,(void*)bq);pthread_join(c,NULL);pthread_join(p,NULL);delete bq;return 0;
}

makefile

main:main.ccg++ -o $@ $^ -lpthread
.PTHONY:
clean:rm -f main

结果:
image.png
可以观察到生产者生产任务,消费者完成任务

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/185914.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何用AB测试完善产品激励体系

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 用户激励体系&#xff0c;也称用户激励机制&#xff0c;是为了让用户持续使用产品&#xff0c;而设计的一套对应规则。在用户激励体系建立过程中&#xff0c;产品可…

目前比较好用的护眼台灯?小白入门最适合的护眼台灯推荐

随着人们对家庭环境艺术的重视&#xff0c;台灯因其摆设在桌案台几上的特殊地位&#xff0c;也要进求特有的装饰效果。家居用台灯开始逐新分流为工艺台灯和书写台灯两类。前者追求外观效果&#xff0c;将发展思路放在材质的创新、造型的求异上&#xff0c;以配合风格多样的家居…

新品|CASAIM-IS(2ND)自动化智能检测系统正式上市,打造更高效、更智能、更安全新体验!

全新第二代中科广电CASAIM-IS自动化智能检测系统正式上市&#xff0c;集合CASAIM最新的“智能控制、智能成像、智能检测”三智技术&#xff0c;为中小型精密复杂工件测量及检测提供一站式高效全自动化智能检测解决方案

查看连接过的wifi历史记录及密码

查看连接过的历史wifi及密码 netsh wlan show profile 查看wifi历史记录 netsh wlan show profile name“北固湾” keyclear 查询某个wifi的密码 netsh wlan export profile folderC:\Users\Administrator\Desktop\wifi keyclear 批量导出wifi配置文件查看密码

STM32H743 RTC精密数字校准 深度剖析

一、问题 项目中数据报文收到的RTC时间总是会慢一些,经过实际几天的测试得出结论:24小时要慢5S左右。根据手册我了解到可以有误差但不会差这么多,所以进行了如下分析并解决问题。 二、分析 1.影响RTC准确性的因素罗列 硬件基础误差(也就是待校准部分) …

RT-DETR算法优化改进:SCConv,空间和通道重建卷积 | CVPR2023 | 卷积变体大作战

💡💡💡本文改进:SCConv(空间和通道重建卷积),一个即插即用的架构单元,可以直接用来替代各种卷积神经网络中的标准卷积。 1)放入Neck RepC3后面; RT-DETR魔术师专栏介绍: https://blog.csdn.net/m0_63774211/category_12497375.html ✨✨✨魔改创新RT-DETR �…

简单高效的定制移动固态硬盘,稳定易用的办公小助手

我在平时的工作中&#xff0c;常常需要处理各种大文件和数据&#xff0c;如果硬盘速度跟不上&#xff0c;那工作效率就会大幅降低。今年固态硬盘的价格大幅下降&#xff0c;有很多国产品牌加入其中&#xff0c;很容易找到一款性价比高的固态硬盘&#xff0c;搭配硬盘盒使用&…

【AI视野·今日Sound 声学论文速览 第三十三期】Wed, 25 Oct 2023

AI视野今日CS.Sound 声学论文速览 Wed, 25 Oct 2023 Totally 8 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Sound Papers CDSD: Chinese Dysarthria Speech Database Authors Mengyi Sun, Ming Gao, Xinchen Kang, Shiru Wang, Jun Du, Dengfeng Yao, Su Jing W…

01ctfer 文件上传

01ctfer 文件上传 启动靶场 访问该地址 代码审计 <?php header("Content-Type:text/html; charsetutf-8"); // 每5分钟会清除一次目录下上传的文件 require_once(pclzip.lib.php);if(!$_FILES){echo <!DOCTYPE html> <html lang"zh">…

用归并排序算法merge_sort( )求解 逆序对的数量 降低时间复杂度为 nlogn

题目简述 给定一个序列有n个数&#xff0c;求n个数中逆序对的个数&#xff0c;逆序对的定义&#xff1a;i < j && a[i] > a[j]。 输入格式 第一行包含一个整数n。 第二行包含 n 个整数&#xff08;所有整数均在1~1e9范围内&#xff09;&#xff0c;表示整数数…

提高Producer的发送速度

发送一条消息出去要经过三步&#xff0c;一是客户端发送请求到服务器&#xff0c;二是服务器处理该请求&#xff0c;三是服务器向客户端返回应答&#xff0c;一次消息的发送耗时是上述三个步骤的总和。在一些对速度要求高&#xff0c;但是可靠性要求不高的场景下&#xff0c;比…

跨国企业扎根中国市场,应该选择什么样的云服务?

众所周知&#xff0c;伴随着中国经济的高速发展&#xff0c;越来越多的跨国企业都将目光瞄向了中国市场。 然而&#xff0c;要想扎根中国市场&#xff0c;开展本地业务创新&#xff0c;什么样的云服务商才是这些跨国企业的最佳选择&#xff1f; 跨国企业转型创新的三大趋势 面对…