【Linux】cp问题,生产者消费者问题代码实现

这篇具有很好参考价值的文章主要介绍了【Linux】cp问题,生产者消费者问题代码实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

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

一、 BlockQueue.hpp(阻塞队列)

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

【Linux】cp问题,生产者消费者问题代码实现,linux,运维,服务器

问:我们怎么知道我们要让一个线程去休眠了那?
答:一定是临界资源不就绪,没错,临界资源也是有状态的!!

问:你怎么知道临界资源是就绪还是不就绪的?你判断出来的!判断是访问临界资源吗?
答:必须是的,也就是判断必须在加锁之后!!

判断当前线程是否要进入等待,需要判断是否满足临界资源的条件
而我们判断临界资源本质是在访问临界区,所有这个操作只能在加锁之后

#pragma once
#include<iostream>
#include<queue>
#include<pthread.h>

using namespace std;

 
template<class T>

class BlockQueue{
    const static int defaultnum=20;

public:
BlockQueue(int maxcap=defaultnum):maxcap_(maxcap)
{
    pthread_mutex_init(&mutex_,nullptr);
    pthread_cond_init(&c_cond_,nullptr);
    pthread_cond_init(&p_cond_,nullptr);
    low_water_ = maxcap_/3;//消费到低于到这个数字时,就唤醒生产者生产
    high_water_ = (maxcap_*2)/3;//生产到这个数字时,就唤醒消费者过来消费
}


void push(const T&in){
    pthread_mutex_lock(&mutex_);
 // 我们怎么知道我们要让一个线程去休眠了那?一定是临界资源不就绪,没错,临界资源也是有状态的!!
  // 你怎么知道临界资源是就绪还是不就绪的?你判断出来的!判断是访问临界资源吗?必须是的,也就是判断必须在加锁之后!!

    if(q.size()==maxcap_){
        //满了,则生产者就去休眠
        pthread_cond_wait(&p_cond_,&mutex_);
      // pthread_cond_wait让线程等待的时候,会自动释放锁!
    }
    // 1. 队列没满 2.被唤醒 
    q.push(in);
    // 你想生产,就直接能生产吗?不一定。你得先确保生产条件满足
   if(q .size() > high_water_) pthread_cond_signal(&c_cond_);
   //当产品数量大于high的时候唤醒消费者队列,让其过来消费
    pthread_mutex_unlock(&mutex_);
}

T pop(){
    pthread_mutex_lock(&mutex_);
    //判断当前线程是否要进入等待,需要判断是否满足临界资源的条件
    //而我们判断临界资源本质是在访问临界区,所有这个操作只能在加锁之后
    if(q.size()==0){
        pthread_cond_wait(&c_cond_,&mutex_);
    }
    T out=q.front();
    // 你想消费,就直接能消费吗?不一定。你得先确保消费条件满足
    q.pop();
    if(q.size()<low_water_){
        pthread_cond_signal(&p_cond_ );
    }
    pthread_mutex_unlock(&mutex_);
    return out;
}

~BlockQueue(){
    pthread_mutex_destroy(&mutex_);
    pthread_cond_destroy(&c_cond_);
    pthread_cond_destroy(&p_cond_);
}



private:
int low_water_;//消费到低于到这个数字时,就唤醒生产者生产
int high_water_;//生产到这个数字时,就唤醒消费者过来消费
pthread_mutex_t mutex_;
pthread_cond_t c_cond_;//消费者的等待队列
pthread_cond_t p_cond_;//生产者的等待队列
queue<T>q;//共享资源
int maxcap_;//阻塞队列的最大容量
};

二、main.cpp

#include "BlockQueue.hpp"
#include <unistd.h>
#include <time.h>

void *Customer(void *args)
{
    BlockQueue<int> *bq = static_cast<BlockQueue<int> *>(args);
    while (true)
    {

        int n = bq->pop();
        cout << "Customer get " << n << endl;
    }
}

void *Productor(void *args)
{
    BlockQueue<int> *bq = static_cast<BlockQueue<int> *>(args);
    srand((unsigned int)time(nullptr));
    int n = 0;
    // 产生随机数放入队列中
    while (true)
    {
        sleep(1);
        n = rand() % 100 + 1;
        bq->push(n);
        cout << "Productor create n: " << n << endl;
    }
}

int main()
{
    BlockQueue<int> *bq = new BlockQueue<int>();
    // 根据目标所需,创建存储不同类型的阻塞队列
    pthread_t c, p;
    pthread_create(&c, nullptr, Customer, bq);  // 消费者线程
    pthread_create(&p, nullptr, Productor, bq); // 生产者线程

    pthread_join(c, nullptr);
    pthread_join(p, nullptr);

    return 0;
}

【Linux】cp问题,生产者消费者问题代码实现,linux,运维,服务器文章来源地址https://www.toymoban.com/news/detail-762869.html

到了这里,关于【Linux】cp问题,生产者消费者问题代码实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java生产者与消费者问题

    等待唤醒机制可以解决经典的“生产者与消费者”的问题。生产者与消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案例。该问题描述了两个(多个) 共享固定大小缓冲区的线程 ——即所谓的“生产者

    2024年02月15日
    浏览(36)
  • 【Linux】深入理解生产者消费者模型

    生产者 - 消费者模型 Producer-consumer problem 是一个非常经典的多线程并发协作的模型,在分布式系统里非常常见。 在多线程开发中,如果生产者生产数据的速度很快,而消费者消费数据的速度很慢,那么生产者就必须等待消费者消费完了数据才能够继续生产数据,同理如果消费

    2024年02月06日
    浏览(36)
  • 【Linux】线程安全-生产者消费者模型

    1个线程安全的队列:只要保证先进先出特性的数据结构都可以称为队列 这个队列要保证互斥(就是保证当前只有一个线程对队列进行操作,其他线程不可以同时来操作),还要保证同步,当生产者将队列中填充满了之后要通知消费者来进行消费,消费者消费之后通知生产者

    2024年02月10日
    浏览(44)
  • 操作系统-进程同步:生产者-消费者问题

    ​ 以生产者-消费者模型为基础,在Windows环境下创建一个控制台进程(或者界面进程),在该进程中创建读者写者线程模拟生产者和消费者。写者线程写入数据,然后将数据放置在一个空缓冲区中供读者线程读取。读者线程从缓冲区中获得数据,然后释放缓冲区。当写者线程

    2023年04月20日
    浏览(45)
  • 【JUC基础】06. 生产者和消费者问题

    学习JUC,就不得不提生产者消费者。生产者消费者模型是一种经典的多线程模型,用于解决生产者和消费者之间的数据交换问题。在生产者消费者模型中,生产者生产数据放入共享的缓冲区中,消费者从缓冲区中取出数据进行消费。在这个过程中,生产者和消费者之间需要保

    2024年02月05日
    浏览(40)
  • 【课设】生产者-消费者问题算法 的设计与实现

    题目:生产者-消费者问题算法 的设计与实现 目     录 1. 课题概述 ... 2 2. 合作分工 ... 2 3. 相关知识 ... 2 4. 系统分析 ... 2 5. 系统设计 ... 2 6. 系统运行测试界面截图 ... 2 7. 总结与心得体会 ... 2 8. 源程序清单 ... 2   1.    课题概述 1.1设计的目的和要求; 在现代软件业的发

    2024年02月08日
    浏览(39)
  • Linux——生产者消费者模型和信号量

    目录 ​​​​​​​ 基于BlockingQueue的生产者消费者模型 概念 条件变量的第二个参数的作用  锁的作用 生产者消费者模型的高效性 生产者而言,向blockqueue里面放置任务 消费者而言,从blockqueue里面拿取任务: 总结 完整代码(不含存储数据的线程) 完整代码(含存储线程)  信

    2024年02月07日
    浏览(40)
  • Linux安装Kafka,创建topic、生产者、消费者

    1.创建安装目录/usr/local/kafka mkdir /usr/local/kafka 2.进入安装包目录 cd /usr/local/kafka  3.下载安装包 wget https://downloads.apache.org/kafka/3.3.1/kafka_2.12-3.3.1.tgz 4.解压安装包 tar -zxvf kafka_2.12-3.3.1.tgz 5.进入cd kafka_2.12-3.3.1目录 cd kafka_2.12-3.3.1/ 6.修改zookeeper配置 cat ./config/zookeeper.properties | grep

    2023年04月17日
    浏览(46)
  • 传统生产者和消费者问题,Sychronized版和Lock版

    面试:单例模式、排序算法、生产者消费者、死锁 问题A B C D 开四个线程跑,在if判断之后被唤醒,没判断条件被执行了两次增加,导致的虚假唤醒问题。      任何一个新的技术,绝对不是仅仅只覆盖了原来的技术,优势,和补充! 精准唤醒线程  Condition

    2024年02月07日
    浏览(34)
  • JUC并发编程学习笔记(三)生产者和消费者问题

    synchronized版- wait/notify juc版-Lock 面试:单例模式、排序算法、生产者和消费者、死锁 生产者和消费者问题 Synchronized版 存在的问题:A、B、C、D四个线程 在线程中判断业务完成唤醒等待应该使用while循环判断,而非if判断,因为if判断值判断一次,在线程中存在一种状态叫虚假唤

    2024年02月06日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包