您好、欢迎来到现金彩票网!
当前位置:秒速牛牛官方网站 > 调试模型 >

第11天)每日源码调试之旅--生产者与消费者模型实现

发布时间:2019-07-17 09:38 来源:未知 编辑:admin

  今天来看生产者与消费者模型实现最终优化方案,也是最流行的一种实现,即采用LinkedBlockingQueue的实现方式:

  main方法中与之前的不同之处是产品仓库采用LinkedBlockingQueue模拟了一个100容量的仓库,其他没有区别,直接进入生产者线程:

  此处与之前的优化方案不同之处在于产品放入仓库的方法,直接将产品存入LinkedBlockingQueue实现的仓库中,外面没有用到任何同步锁,那么锁的实现肯定在put方法里面,跟进去看看:

  此处在方法内部实现了一个重入锁putLock,重入锁的作用是获得锁的当前线程可以重新再进入该锁,该锁的lockInterruptibly方法可以让当前线程获取到锁除非当前线程被打断,当前线程再次进入该锁会使重入锁保存的当前线程数量加一,该锁的unlock方法可以让当前线程释放锁,具体实现不细述,可以把他看成一个同步锁,锁的边界用这个两个方法来界定,在锁的作用域内实现了往该阻塞队列即仓库的存放产品过程,满了就让生产者等待,此处是调用notFull.await方法,看看notFull的定义:

  即等待调用puts方法的线程的等待队列,类似还有notEmpty,即等待调用gets方法的线程的等待队列,简单的讲就是存放线程的队列,notFull.await方法指让所有想要调用LinkedBlockingQueue的put方法进行元素存放的线程进行等待,因为当前LinkedBlockingQueue已满,如果LinkedBlockingQueue未满,就让一个元素入队并将元素数量加一,此处应用原子类来进行自增操作,估计是防止可以重进入的线程造成对元素数量的并发修改,存放完成后如果此时队列还有容量,就给调用LinkedBlockingQueue的put方法的线程发信号,让其进行put操作,即让生产者继续生产,随后把锁释放,让这些生产者线程能够有锁可用。如果队列中一开始就没有元素(c初始值为-1,加一后为0),说明有调用LinkedBlockingQueue的take方法的线程,即消费者线程在等待,就要调用signalNotEmpty方法:

  此处先获取takeLock,保证没有线程持有取出元素需要的锁,即消费者的锁,然后唤醒调用LinkedBlockingQueue的take方法的线程,即消费者线程,让其继续消费,最后释放锁给消费者线程使用。

  原理与put方法一样,只不过这里保持了一个takeLock——从队列中取走元素需要的锁,即消费者锁,其他可以对比着看,不再赘述。

  由上面的调试可以看出,这个优化方案在生产者往仓库放入产品和消费者从仓库取出产品的过程中各加了一把锁,两把锁各自在队列的队头和对尾同步存线程和取线程,这样这两种操作仓库的方式就不会相互阻塞,可以同时执行存和取线程,只有存线程与存线程,取线程和取线程直接需要同步,而且生产和消费活动也不会被锁阻塞,这种优化方式就可以较高的提升效率。

  以上就是生产者与消费者模型实现的第三种方案,至此,生产者与消费者模型实现的调试就此结束。

  这是我的操作系统实验课的实验之一,实验要求“实现生产者和消费者程序”。老师给了我们示例程序,要求我们自己修改调试。程序代码如下,已经在本地linux系统上能够正确运行。p是模拟生产者,c是模拟消费者,...博文来自:hxxjxw的博客

  今天开始调试同事实现的三种生产者与消费者模型,三个实现是逐步优化而来的。三个实现代码全部调试完毕后会发步在github上。项目代码:博文来自:MAC完美的博客

  今天来看昨天实现的生产者与消费者模型的优化,昨天实现的方案的缺点在于仓库存取产品只能让一个线程来存取,其他线程需要等待仓库的锁,并且产品的生产和消费过程也需要获取仓库的锁才能进行,现在来看一个优化后者...博文来自:MAC完美的博客

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

  LinuxC语言实现生产者和消费者模型LinuxC语言实现生产者和消费者模型LinuxC语言实现生产者和消费者模型LinuxC语言实现生产者和消费者模型LinuxC语言实现生产者和消费者模型LinuxC语言实现生产者和消费者模型Linux...

  概念生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不...博文来自:lvxin的博客

  生产者消费者模型一个模型,可以用来搭建消息队列。主要用于解决·两个线程之间速度不匹配问题,在两个线程之间建立一个缓存空间。用一个队列来充当缓存空间,如果生产者生产过快就让生产者线程等一等,若消费者消费...博文来自:最自由的笑的博客

  一、模型简介如图:一共有三种关系:生产者与生产者的互斥关系,消费者与消费者的互斥关系,生产者与消费者的互斥且同步关系。两种角色:生产者(线程)与消费者(线程)一个交易场所:仓库(一段内存空间,且可存可...博文来自:honeyJ

  1.概念  有一个或多个生产者生产某种类型的数据,并放在缓冲区里(生产者),有一个消费者从缓冲区中取数据,每次取一项(消费者)。系统保证任何时候只有一个主题可以访问缓存区。所以当生产满时,生产者不会再...博文来自:zhu_931的博客

  什么是生产者和消费者模型什么是生产者消费者模型?生产者和消费是操作系统中一种重要的模型,它描述的是一种等待和通知的机制,如下图。生产者和消费者模型必须具有的条件用一句话概括,生产者消费者模型必须具有的...博文来自:leap的博客

  循环队列可以实现一个生产者与一个消费者模型,不使用锁。 循环队列:size=10生产者线递增的整数push到队列(尾部不存储,也就是最大存9个数),满了就等1s。消费者线s从队...博文来自:xiongli880612的专栏

  生产者与消费者模型#前言对于生产者消费者模型必须要知道的:三二一原则三二一原则: 三种关系 生产者与生产者之间,生产者与消费者,消费者与消费者 生产者与生产者之间的关系:互斥 也...博文来自:凯的博客

  一个系统是如何运行起来的?通过安卓的源码分析我们大概可以知道,Android在驱动层,在上层都采取生产-消费者模型来构建整个系统;因此对于生产-消费者模型的理解,就显得十分重要;首先通过下图,让大家对...博文来自:jike0901xuye的专栏

  最近学习廖老师的Python3教程,关于协程那块讲得不是很详细,相信很多人像我一样看不懂,经过研究终于弄懂了,现在把学习成果分享给大家。首先看看教程中提到的经典”生产者-消费者“模型,传统的解决方案是...博文来自:Phoenixor

  代码演示首先,消费者函数从队列中取一次数值然后调用q.task_done()通知生产者函数,该元素我已经取过了,直到将全部元素取出。在生产者函数中调用q.join()时,函数被挂起,直到队列的数...博文来自:

  为什么要线程通信 多线程并发时,默认情况下CPU是随机切换线程的。当我们需要多个线程共同来完成一个任务,并且希望他们有规律的执行,那么线程之间就需要有一些协调的通信,以此来达到多个线程来操作一份数据。...博文来自:cccrush的博客

  前言在工作中常常听到某某大牛之间的交谈会涉及到,xx消费者啊啥的,到底什么大牛之间讲的是什么?这篇文章主要解决三个问题:1.到底什么是生产者和消费者,以及它们之间的故事2.它们之间靠什么交流3.应用场...博文来自:咖啡色的羊驼

  生产者消费者模型简单来说就是“321原则(并非某一规则,而是为了理解生产者消费者模型)”“3”代表的是三种关系生产者与消费者的互斥与同步关系生产者与生产者的互斥(或竞争)关系消费者与消费者的互斥(或竞...博文来自:double_happiness的博客

  协程又被称为微线程,它的特点是不需要进行线程的切换,因为整个程序的执行过程中,只有一个线程.没有线程切换的开销,和多线程相比较,线程数量越多,协程的性能就越高.它子程序的执行是由程序自身控制.又由于只...博文来自:Chen_dSir的博客

  多线程协同任务之:生产者和消费者模型介绍在上一篇中介绍了多线程的等待和唤醒机制,这一篇我们就实践一下,多个生产者和多个消费模型。假如有一个资源类Resouce,其有一个属性name属性和我们赋予的一个...博文来自:小白成长记录

  生产者消费者模型当中有两大类重要的角色,一个是生产者(负责造数据的任务),另一个是消费者(接收造出来的数据进行进一步的操作)。为什么要使用生产者消费者模型?   在并发编程中,如果生产者处理速度很...博文来自:Monicx的博客

  1.生产者消费者模型从现实生活中的角度出发,对于这个模型,我们可以总结为321原则,即:三种关系:生产者与生产者:互斥关系,我生产的时候你不能生产消费者与消费者:互斥关系,我消费的时候你不能消费生...博文来自:zhangye3017的博客

  信号量和管程都是操作系统用于同步提供的两种方法,我们将结合生产者与消费者模型对此进行学习。什么是信号量?为了提高系统的并发性,我们引入了多进程,多线程,但是这样子带来了资源竞争,也就是多个程序同时访问...博文来自:xy913741894的博客

  写该篇博客原因:生产者-消费者模型挺常用的,笔者记性又不好,人也比较笨,只好自己写着玩,以后自己用自己看自己写的博客就是。╮(๑•́₃•̀๑)╭ 本博客为参照书《深入理解计算机系统》来通过信号量来实现...博文来自:ty1121466568的博客

  三个关键词:消费者/生产者/模型模型:可以理解为用于解决一类问题的统一方法/模板生产者:比喻的是在程序中负责产生数据的任务消费者:比喻的是在程序中负责处理数据的任务实现生产者------gt...博文来自:风中琉璃

  之前我们学过多线程的生产者消费者模型还以这个判断端口是否可以访问为例:先生成数据:defcreate_data():创建测试数据,文件中生成200个IP...博文来自:淋巴cell学习py之路

  [size=medium]读这篇文章之前,首先要弄明白java对象的两个方法,wait和notify或者notifyAll,那弄懂这两个方法又要知道一个概念,java中Object类有个对象锁,所有的...博文来自:YOUWENWU的专栏

  条件变量与互斥锁使用,生产者和消费者模型博文来自:Be The Best!

  消费者模型生产者-消费者问题是一个经典的进程同步问题,生产者进程在生产产品,并将这些产品提供给消费者进程去消费。为使生产者进程与消费者进程能并发执行,在两者之间设置一个具有N个缓冲区的缓冲池,生产者进...博文来自:冉小栩的博客

  前言生产者消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一存储空间,生产者向空间里生产数据,而消费者取走数据。阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。这个阻塞...博文来自:Mlib

  生产者-消费者(producer-consumer)问题,也称作有界缓冲区(bounded-buffer)问题,两个进程共享一个公共的固定大小的缓冲区。其中一个是生产者,用于将消息放入缓冲区;另外一个...博文来自:t_x_l_的博客

  根据QMutex和QSemaphore的特点,我们可以实现一个生成者对应多个消费者的的生产者模型。可参考:博文来自:fanyun的博客

  在“进程间通信----信号量”一文中,有简单介绍过生产者消费者模型的基本概念。在下文中将使用有关线程的互斥与同步的相关概念来实现两种不同类型的生产者消费者模型。在本文中侧重于线程间同步的实...博文来自:sandmm112的博客

  最近做公司项目遇到一个问题,加载20万的日志文件,解析后写入数据库中。做完后发现读文件、解析、写入数据依次搞下来,速度实在是太慢。所以学习用多线程的来完成这个工作,考虑用生产者消费者模式来完成。单生产...博文来自:邯飞的博客

  jquery/js实现一个网页同时调用多个倒计时(最新的)nn最近需要网页添加多个倒计时. 查阅网络,基本上都是千遍一律的不好用. 自己按需写了个.希望对大家有用. 有用请赞一个哦!nnnn//jsn...博文来自:Websites

  PHP是能让你生成动态网页的工具之一。PHP网页文件被当作一般HTML网页文件来处理并且在编辑时你可以用编辑HTML的常规方法编写PHP。最近在折腾那个安卓扫码登录的功能,然后网页端是用php的做了,...博文来自:朱培(知浅_ZLH)

  今天把本人花费一个月左右整理的600多款小程序源码发布出来,以后每个月还会持续更新,很大一部分都带有后台源码并包含有小程序上线教程,帮你分分钟上线自己的小程序,下面我们来看看目录截图,最后面会把源码目...博文来自:明礼馨德的博客

  前言本文是对之前的一篇文章Spring+SpringMVC+mybatis+Quartz整合代码部分做的一个修改和补充, 其中最大的变化就是后台框架变成了Spring Boot。本工程所用到的技术或工...博文来自:天降风云的博客

http://sec-ir.com/diaoshimoxing/610.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有