博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
生产者与消费者模式(理解)
阅读量:6935 次
发布时间:2019-06-27

本文共 655 字,大约阅读时间需要 2 分钟。

生产者/消费者模式:需要使用到同步,以及线程,属于多并发行列

产生数据的模块,就形象地称为生产者;而处理数据的模块,就称为消费者。 

单单抽象出生产者和消费者,还够不上是生产者/消费者模式。该模式还需要有一个缓冲区处于生产者和消费者之间,作为一个中介。生产者把数据放入缓冲区,而消费者从缓冲区取出数据。

解耦:

假设生产者和消费者分别是两个类。如果让生产者直接调用消费者的某个方法,那么生产者对于消费者就会产生依赖(也就是耦合)。将来如果消费者的代码发生变化,可能会影响到生产者。而如果两者都依赖于某个缓冲区,两者之间不直接依赖,耦合也就相应降低了。

支持并发:

生产者直接调用消费者的某个方法,还有另一个弊端。由于函数调用是同步的(或者叫阻塞的),在消费者的方法没有返回之前,生产者只好一直等在那边。万一消费者处理数据很慢,生产者就会白白糟蹋大好时光。

使用了生产者/消费者模式之后,生产者和消费者可以是两个独立的并发主体(常见并发类型有进程和线程两种)。生产者把制造出来的数据往缓冲区一丢,就可以再去生产下一个数据。基本上不用依赖消费者的处理速度。其实当初这个模式,主要就是用来处理并发问题的。

支持忙闲不均:

缓冲区还有另一个好处。如果制造数据的速度时快时慢,缓冲区的好处就体现出来了。当数据制造快的时候,消费者来不及处理,未处理的数据可以暂时存在缓冲区中。等生产者的制造速度慢下来,消费者再慢慢处理掉。

环形缓冲区(减少了内存分配的开销)

双缓冲区(减少了同步/互斥的开销)

消费者:

生产者:

缓冲区:

 

转载地址:http://zzwnl.baihongyu.com/

你可能感兴趣的文章
开源Gis简介(转)
查看>>
Linux iptables防火墙设置与NAT服务配置
查看>>
父子对等组之间的关系
查看>>
JMX操作ActiveMQ(2)
查看>>
HP-UX磁带备份错误收集
查看>>
html Frame、Iframe、Frameset 的区别 详细出处参考:http://www.jb51.net/web/22785.html
查看>>
[原]重要工具集
查看>>
Leetcode: Pow(x, n) and Summary: 负数补码总结
查看>>
Android启动画面实现
查看>>
HashMap详解
查看>>
WSHPSRS-匹克选择列表生成器-SRS(R12.2.3)
查看>>
Entity Framework 6 Recipes 2nd Edition(9-1)译->用Web Api更新单独分离的实体
查看>>
XamarinForms教程构建XamarinForms开发环境
查看>>
Entity Framework 6 Recipes 2nd Edition(10-6)译 -> TPT继承模型中使用存储过程
查看>>
Android开发之三种动画
查看>>
java中的按位与运算
查看>>
[android] androidPN开源项目介绍
查看>>
邁向IT專家成功之路的三十則鐵律 鐵律十七:IT人休閒之道-清心
查看>>
程序员面试那些事儿
查看>>
editplus的配置和使用
查看>>