生产者消费者问题

2023-05-16

目录

生产者消费者模型概述

 生产者消费者模型的优点

1.解耦

2.并发性

3.忙闲不均

Linux系统下模拟实现

思路

代码实现

运行结果


生产者消费者模型概述

     生产者消费者问题也称为有限缓冲问题 。大概描述就是:两个或更多的线程共享一个缓冲区,其中一个或多个线程作为“生产者”向缓冲区存储数据,另一个或多个线程作为“消费者”从缓冲区取出问题。

该模型的几个特点:

生产者和消费者是互斥的使用缓冲区;

缓冲区空时,消费者不能读取数据;

缓冲区满时,生产者不能添加数据。

 生产者消费者模型的优点

1.解耦

就是指生产者添加数据和消费者读取数据相互不影响。从代码方面来说就是生产者和消费者并不直接相互调用,两者的代码发生变化时对对方都不产生影响。

2.并发性

字面意思,生产者和消费者可以并发的执行。如果没有缓冲区,消费者直接从生产者拿去数据时,就需要等待生产者产生数据,同样生产者也需要等待消费者消费数据。而在该模型下,生产者和消费者是两个独立并发的主体,不需要等待。

3.忙闲不均

在该模型下,缓冲区未放满时,生产者和消费者并不相互影响,所以不会产生占用CPU时间片的问题;而当缓冲区放满时,生产者就不在生产数据,同样消费者在缓冲区空时也不会再消费数据。使得两者的运行处于一种动态平衡的状态

Linux系统下模拟实现

思路

假设一个生产者消费者问题:有2个生产者,3个消费者

需要用到2个信号量一个互斥锁来实现互斥的使用缓冲区

代码实现

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<pthread.h>
#include<semaphore.h>

#define SC_NUM   2
#define XF_NUM   3
#define BUFF_SIZE  5

int buff[BUFF_SIZE];
int in=0;
int out=0;

sem_t sem_empty;
sem_t sem_full;
pthread_mutex_t mutex;

void* sc_thread(void* arg)
{
    int index=(int)arg;
    for(int i=0;i<30;i++)
    {
       sem_wait(&sem_empty);
       pthread_mutex_lock(&mutex);
       buff[in]=rand()%100;
       printf("第%d个线程,产生数据%d,在%d位置\n",index,buff[in],in);
       in=(in+1)%BUFF_SIZE;
       pthread_mutex_unlock(&mutex);
       sem_post(&sem_full);
       //随机睡眠几秒便于观察
       int n =rand()%10;
       sleep(n);
    }
}

void* xf_thread(void* arg)
 {
    int index=(int)arg;
    for(int i=0;i<20;i++)
    {
       sem_wait(&sem_full);
       pthread_mutex_lock(&mutex);
       printf("——消费者(%d)读取数据%d,在%d的位置\n",index,buff[out],out);
       out=(out+1)%BUFF_SIZE;
       pthread_mutex_unlock(&mutex);
       sem_post(&sem_empty); 
       int n=rand()%10;
       sleep(n);
    }
 }
 int main()
 {
    sem_init(&sem_empty,0,BUFF_SIZE);
    sem_init(&sem_full,0,0);
    pthread_mutex_init(&mutex,NULL);
    pthread_t sc_id[SC_NUM];
    pthread_t xf_id[XF_NUM];
 
    for(int i=0;i<SC_NUM;i++)
    {
        pthread_create(&sc_id[i],NULL,sc_thread,(void*)i);
    }
    for(int i=0;i<XF_NUM;i++)
    {
       pthread_create(&xf_id[i],NULL,xf_thread,(void*)i);
    }
    for(int i= 0;i<SC_NUM;i++)
    {
        pthread_join(sc_id[i],NULL);
    }
    for(int i=0;i<XF_NUM;i++)
    {
        pthread_join(xf_id[i],NULL);
    }
 
    sem_destroy(&sem_empty);
    sem_destroy(&sem_full);
    pthread_mutex_destroy(&mutex);
    exit(0);
 }


运行结果

上图截取了部分数据

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

生产者消费者问题 的相关文章

随机推荐

  • 移动端webUI框架(HTML5手机框架)

    淘宝SUI Mobile框架 官网地址 xff1a http m sui taobao org SUI Mobile 是一套基于 Framework7 开发的UI库 它非常轻量 精美 xff0c 只需要引入我们的CDN文件就可以使用 xff
  • 在线创建dg环境 adg

    在线创建dg环境 adg 在两个库的环境变量中添加如下 export TNS ADMIN 61 ORACE HOME network admin 主库 xff1a lsnrctl stop Shutdown immediate Startu
  • Ubuntu18.04 编译 Android10.0 系统环境

    Ubuntu18 04 编译 Android10 0 系统环境 xff0c 每次搞一个新电脑或环境 xff0c 编译总要搞半天 xff0c 虽然知道是环境安装的问题 xff0c 但确实很烦和耗时 xff0c 关键是报错各异 思路 xff1a
  • 如何在Init里添加一个自启动程序,Server

    一 添加一个系统服务的权限声明 情景 xff1a 定义一个init启动的service xff0c demo service xff0c 对应的执行文件是 system bin demo 1 创建一个demo te在 device medi
  • [解决]Eclipse不能开发Web项目

    因为好久没有用Eclipse开发Web项目 xff0c 突然 xff0c 今天开发Web项目的时候 xff0c 怎么也建立不了Web项目 所以揣想是Eclipse版本不对或者是没有装插件 因为自己的Eclipse已经安装了很多其他的插件 x
  • 解决Tomcat访问Web显示HTTP Status 404 - /hrm/

    步骤 xff1a 1 打开Eclipse xff0c 双击Tomcat 2 更改Deploy path xff0c 它后面的值默认是 34 wtpwebapps 34 把它改成 34 webapps 34 也就是tomcat中发布项目所在的
  • Cordova系列学习教程01. 了解Cordova

    转载请标明出处 xff1a http blog csdn net junzaivip article details 51151924 xff0c 本文出自 junzaivip博客 概念 xff0c phonegap与cordova之间的区
  • 2016年小结 2017年展望

    转载请标明出处 xff1a http blog csdn net junzaivip article details 54231935 xff0c 本文出自 junzaivip博客 每个人的世界里有的不止是光鲜 xff0c 其实还有更多别人
  • 如何将本地已有的项目加入git版本管理

    本文地址 xff1a https blog csdn net junzaivip article details 82626584 如果自己已经新建的一个项目 xff0c 暂时没有加入项目管理 xff0c 且名称不变 xff0c 如何加入
  • 基于github搭建自己的个人博客

    今天一时兴起 xff0c 看见别人使用的github io搭建了属于自己的个人博客 xff0c 我也使用github搭建一个自己的博客系统 xff1b 步骤一 xff1a 创建一个自己的github账号 xff1b xff08 略 xff0
  • ES6基本用法

    ES6基本用法 字符串的基本用法 let junzai 61 34 史慧君 34 let blog 61 34 淘宝多的是 xff0c 都是正版 xff0c 放心买 学习字符串 34 let blog 61 96 淘宝多的是 xff0c 都
  • Active MQ C++实现通讯记录

    Active MQ C 43 43 实现通讯 背景知识 xff1a ActiveMQ是一个易于使用的消息中间件 消息中间件 我们简单的介绍一下消息中间件 xff0c 对它有一个基本认识就好 xff0c 消息中间件 xff08 MOM xff
  • Node升级到最新版本

    检查目前的版本 xff1a localhost shihuijun node v v8 9 3 清除node js的cache 不确定有没有必要 localhost shihuijun sudo npm cache clean f Pass
  • Android Activity 重载 onConfigurationCangerd之屏幕方向改变

    一 onConfigurationChanged 触发时机 onConfigurationChanged 事件不只是屏幕方向改变才触发 xff0c 其他一些系统设置改变也可以触发 xff0c 例如 xff1a 打开软件盘 屏幕旋转 捕获事件
  • Android原生控件【TimePickerDialog】简单的使用

    xff08 1 xff09 首先在布局文件中定义一个Button以及对应的id xff08 2 xff09 当点击该按钮时 xff0c 代码如下 xff1a Calendar calendar 61 Calendar getInstance
  • 2019-08-10 homebrew更新更新慢的问题

    Homebrew 镜像使用帮助 直接在 路径下执行以下命令 替换现有上游 git C 34 brew repo 34 remote set url origin https mirrors tuna tsinghua edu cn git
  • contos安装ElasticSearch解决 bash: shasum: 未找到命令...

    centos需要运行一下 xff1a yum install perl Digest SHA
  • yum 无法使用的解决

    在网上看到的解决方法 xff0c 故保存于此 问题 xff1a Loaded plugins fastestmirror Determining fastest mirrors YumRepo Error All mirror URLs a
  • 报错-crontab -e 定时任务执行失败排查

    使用 crontab e 定时启动 jar 包服务失败 xff0c 排查过程如下 xff1a 1 查看 crontab 服务 span class token function crontab span l 陈列出了待执行任务列表 xff0
  • 生产者消费者问题

    目录 生产者消费者模型概述 生产者消费者模型的优点 1 解耦 2 并发性 3 忙闲不均 Linux系统下模拟实现 思路 代码实现 运行结果 生产者消费者模型概述 生产者消费者问题也称为有限缓冲问题 大概描述就是 xff1a 两个或更多的线程