【Linux】生产者消费者

news2025/1/19 23:09:49

生产者消费者

生产者消费者问题概述
生产者 / 消费者问题,也被称作有限缓冲问题。可以描述为:两个或者更多的线程共享同一个缓冲
区,其中一个或多个线程作为 生产者 会不断地向缓冲区中添加数据,另一个或者多个线程作为 消费者
从缓冲区中取走数据。生产者 / 消费者模型关注的是以下几点:
生产者和消费者必须互斥的使用缓冲区
缓冲区空时,消费者不能读取数据
缓冲区满时,生产者不能添加数据
 
生产者消费者模型优点:
1. 解耦:因为多了一个缓冲区, 所以生产者和消费者并不直接相互调用,这样生产者和消费者的代码 发生变化,都不会对对方产生影响 。这样其实就是把生产者和消费者之间的强耦合解开,变成了生 产者和缓冲区,消费者和缓冲区之间的弱耦合
2. 支持并发:如果消费者直接从生产者拿数据,则消费者需要等待生产者生产数据,同样生产者需要 等待消费者消费数据。 而有了生产者/消费者模型,生产者和消费者可以是两个独立的并发主体。 生产者把制造出来的数据添加到缓冲区,就可以再去生产下一个数据了。而消费者也是一样的,从 缓冲区中读取数据,不需要等待生产者。这样,生产者和消费者就可以 并发 的执行
3. 支持忙闲不均:如果消费者直接从生产者这里拿数据,而生产者生产数据很慢,消费者消费数据很 快,或者生产者生产数据很多,消费者消费数据很慢。都会造成占用CPU 的时间片白白浪费。生产 者/ 消费者模型中,生产者只需要将生产的数据添加到缓冲区, 缓冲区满了就不生产了 。消费者从 缓冲区中读取数据, 缓冲区空了就不消费了 ,使得生产者/ 消费者的处理能力达到一个动态的平 衡

 

生产者消费者模型实现
假定缓冲池中有 N 个缓冲区,一个缓冲区只能存储一个 int 类型的数据。定义互斥锁 mutex 实现对缓
冲区的互斥访问;计数信号量 dempty 用来表示空闲缓冲区的数量,其初值为 N ;计数信号量 dfull 用来表
示有数据的缓冲区的数量,其初值为 0
在实现生产者消费者模型时我们要考虑加锁和p v操作的顺序
如果先加锁 那么在系统进行p操作的时候就会阻塞 等待回复  但是此时没有外力是无法恢复的
因此我们在实现生产者和消费者模型时 我们应该先进行p v 操作 
再进行加锁操作
因此生产者消费者的模型应该是这样的

 

 

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <assert.h>
#include <pthread.h>
#include <semaphore.h>
#include <time.h>
#define BUFF_MAX 30
#define SC_NUM 2 
#define XF_NUM 3
int in = 0;
int out = 0;
sem_t sem_empty;
sem_t sem_full;
pthread_mutex_t mutex;
int buff[BUFF_MAX] = {0};
void * sc_thread(void* arg)
{
  i nt index = (int)arg;
   while( 1 ){
   sem_wait(&sem_empty);
   pthread_mutex_lock(&mutex);
   buff[in] = rand()%100;
   printf("生产者%d 产生数据%d,in=%d\n",index,buff[in],in);
   in = (in + 1) % BUFF_MAX;
   pthread_mutex_unlock(&mutex);
   sem_post(&sem_full);
   int n = rand() % 10;
   sleep(n);
  }
}
void * xf_thread(void* arg)
{
   int index = (int)arg;
   while(1){
   sem_wait(&sem_full);
   pthread_mutex_lock(&mutex);
   printf("消费者%d 消费数据%d, out=%d\n",index,buff[out],out);
   out = (out+1) % BUFF_MAX;
   pthread_mutex_unlock(&mutex);
   sem_post(&sem_empty);
   int n = rand() % 10;
   sleep(n);
   }
}
int main(){
  pthread_mutex_init(&mutex,NULL);
  sem_init(&sem_empty,0,BUFF_MAX);
  sem_init(&sem_full,0,0);
  srand((int)time(NULL));
  pthread_t sc_id[SC_NUM];
  pthread_t xf_id[XF_NUM];
  int i = 0;
  for( ; i < SC_NUM; i++ ){
  pthread_create(&sc_id[i],NULL,sc_thread,(void*)i);
  }
  for( i = 0; i < XF_NUM; i++ ){
  pthread_create(&xf_id[i],NULL,xf_thread,(void*)i);
  }
  for( i = 0; i < SC_NUM; i++ ){
  pthread_join(sc_id[i],NULL);
  }
  for( 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);
}

rand函数是获取一个随机数值

我们使用两个线程来模拟生产者和消费者 生产者和消费者线程内部都是先进行p v 操作

再执行加锁 读写步骤

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

优先级队列--堆的应用(堆排序与TopK问题)

堆排序&#xff1a;比较方式为小于建大堆 priority_queue(Iterator first, Iterator last): _con(first, last) // 1、使用vector的区间构造函数来初始化_con{// 2、建堆&#xff1a;从完全二叉树的最后一个非叶子结点来进行向下调整for (int i (size() - 2) / 2; i > 0; i…

2023真无线蓝牙耳机怎么选?值得入手的蓝牙耳机推荐

蓝牙耳机作为近几年备受人们欢迎的数码产品&#xff0c;很多人都想买到一款适合自己的蓝牙耳机。但&#xff0c;随着蓝牙耳机的快速发展&#xff0c;蓝牙耳机市场充斥着各种机型&#xff0c;它们有着不同的性能、价格、外观等。所以&#xff0c;不少人都有一个疑惑&#xff0c;…

玩转 MySQL Shell 沙盒实例

什么是沙盒实例&#xff1f; 沙盒实例仅适用于出于测试目的在本地计算机上部署和运行&#xff0c;可以与 InnoDB Cluster 、 InnoDB ClusterSet 和 InnoDB ReplicaSet 一起工作。 如何使用部署沙盒的 API 函数&#xff1f; 语法dba.deploySandboxInstance(port[, options])解…

Mybatis学习笔记(一)

什么是框架&#xff1f; 它是我们软件开发中的一套解决方案&#xff0c;不同的框架解决的是不同的问题使用框架的好处&#xff1a;框架封装了很多的细节&#xff0c;使开发者可以使用极简的方式实现功能&#xff0c;大大提高开发效率 三层架构 表现层&#xff1a;用于展示数…

慕尼黑工业大学开源含四季的数据集:用于自动驾驶的视觉长期定位

以下内容来自[从零开始机器人SLAM知识星球] 每日更新内容 点击领取学习资料 → 机器人SLAM学习资料大礼包 #论文# #开源数据集# 4Seasons: Benchmarking Visual SLAM and Long-Term Localization for Autonomous Driving in Challenging Conditions 地址&#xff1a;https:/…

LeetCode[295]数据流的中位数

难度:困难题目&#xff1a;中位数是有序整数列表中的中间值。如果列表的大小是偶数&#xff0c;则没有中间值&#xff0c;中位数是两个中间值的平均值。例如 arr [2,3,4] 的中位数是 3 。例如 arr [2,3] 的中位数是 (2 3) / 2 2.5 。描述&#xff1a;实现 MedianFinder 类:…

工信部及多地政府联合阿里健康在全国展开防疫保供专项行动

为了切实服务好百姓的购药需求&#xff0c;在工信部和各地政府的指导下&#xff0c;12月疫情政策调整以来&#xff0c;阿里健康已先后在全国20多个省市及地区配合药品物资精准投放工作&#xff0c;为各地居民重点供退热药、N95口罩等紧缺药品和物资&#xff0c;尽全力打好药品保…

Android系统定制开发过程快速查找定位分析代码的方法

推荐阅读 ​Android系统开发过程快速查找定位代码的方法 Android10以上系统定制Root权限(隐藏Root权限) 商务合作 2023年招聘 2023年逆向分析资料汇总 Android系统开发过程&#xff0c;经常需要进行文件查找、代码查找&#xff0c;常用find和grep查找命令 1.find命令 根据文…

短短六年时间冲到二奢品类第一,妃鱼如何做到的?

随着消费需求不断增长&#xff0c;二手奢侈品市场近五年来快速向规模化、平台化发展&#xff0c;妃鱼、红布林、胖虎等二奢电商品牌迅速崛起&#xff0c;成为风头劲胜的网红。国泰君安研究报告显示&#xff0c;中国闲置高端消费品零售市场规模已从2016年162亿元增长至2020年的5…

Vue js混淆加密 webpack-obfuscator

公司要求加密混淆js 之前 是用的glifyjs-webpack-plugin ,感觉不行。 然后使用了webpack-obfuscator 非常nice~&#xff0c;除了打包出来体积会有点大&#xff0c;浏览的网页会变慢&#xff0c;选择最低是就还好&#xff0c; 有多个条件属性可以选择&#xff0c; 可以选择高度混…

networkx学习(三) 随机网络

networkx学习(三) 随机网络 1.规则网络 2.随机网络的生成算法 第一种:G(N,L) import random import itertoolsdef GNL(N, L):G = nx.Graph()G.

硬盘数据如何恢复?电脑硬盘资料恢复,方法就是这么简单!

硬盘作为重要的存储设备&#xff0c;里面保存的数据是很重要的。日常生活和工作中&#xff0c;硬盘发生数据丢失也是很常见的事情&#xff0c;比如&#xff1a;误删重要文件并清空了回收站、文件打不开提示格式化、分区变成RAW格式、电脑重新分区等。各种数据丢失原因数不胜数。…

卷积神经网络-cnn和lstm

文章目录1. 卷积神经网络1.1 卷积神经网络的基础1.2 卷积神经网络和传统的网络的区别1.3 卷积的作用1.3.1 图像颜色通道1.3.2 卷积的次数1.4 卷积层涉及的参数1.4.1 滑动窗口的步长1.4.2 卷积核的大小1.4.3 边缘填充1.4.4 卷积核的个数1.4.5 卷积参数共享1.5 池化层1.6 整体网络…

如何在Microsoft Word设置导航窗格以重新排列页面

本文包括使用导航窗格和复制粘贴在Microsoft Word 2019、2016和Office 365中移动页面的说明。 Microsoft Word不会将文档视为单独页面的集合,而是将其视为一个长页面。因此,重新排列Word文档可能会很复杂。在Word中移动页面的一种更简单的方法是使用导航窗格。 注意:要在导…

Vue 3 桌面应用开发(文末附视频)

在正式开始之前&#xff0c;我想先直接“输出”一些背景信息&#xff0c;既能阐明我的观点&#xff0c;也希望可以坚定你学习本小册的决心。 首先&#xff0c;桌面应用开发在未来一定会大放异彩&#xff0c;桌面应用相对于移动应用来说优势非常明显&#xff08;交互区域更大、…

TCP/IP网络编程(3)——地址族与数据序列

文章目录第 3 章 地址族与数据序列3.1 分配给套接字的 IP 地址与端口号3.1.1 网络地址&#xff08;Internet Address&#xff09;3.1.2 网络地址分类与主机地址边界3.1.3 用于区分套接字的端口号3.2 地址信息的表示3.2.1 表示 IPV4 地址的结构体3.2.2 结构体 sockaddr_in 的成员…

王道操作系统笔记(二)———— 进程与线程

文章目录一、进程的概念和特征1.1 进程的概念1.2 进程的组成1.3 进程的特征1.4 进程的状态与转换1.5 进程控制1.6 进程的通信1.6.1 共享存储1.6.2 消息传递1.6.3 管道通信1.7 父进程与子进程二、线程概念和多线程模型2.1 线程的概念2.2 线程的属性2.3 线程的实现方式2.4 多线程…

C#【必备技能篇】DatagridView添加行时,设置行标题单元格的值为行数

文章目录1、DatagridView添加行的代码2、方法一&#xff1a;【每次添加行都重新刷新了全部的行数&#xff0c;不推荐】3、方法二&#xff1a;【只有一个DatagridView时&#xff0c;推荐此方法】4、方法三&#xff1a;【通用方法&#xff0c;多个DatagridView都有这个需求时&…

利用 Burp Suite 进行密码爆破

利用 Burp Suite 进行密码爆破1.Intruder 功能介绍2.攻击类型3.实战4.验证码爆破1.Intruder 功能介绍 使用 BP 工具的 Intruder 模块高度可配置&#xff0c;可以对目标网站进行密码爆破&#xff0c;一般被用于网站的安全渗透测试场景 BP 工具的 Intruder 模块包含几个功能标签…

解决2022.3.1版本中 IDEA中 XML文件屎黄色背景 的方法

问题&#xff1a;在idea打开mybatis的xml映射文件&#xff0c;出现大面积黄色背景提示 1&#xff1a;打开文件&#xff0c;点击设置 2&#xff1a;打开编辑器--> 检查--> SQL 3&#xff1a;受不了&#xff0c;我的是中文&#xff0c;我换成英文继续了 找到 No data sou…