2019独角兽企业重金招聘Python工程师标准>>>

◇判断“空”和“满”

上述的操作并不复杂,不过有一个小小的麻烦:空环和满环的时候,R和W都指向同一个位置!这样就无法判断到底是“空”还是“满”。大体上有两种方法可以解决该问题。

办法1:始终保持一个元素不用

当空环的时候,R和W重叠。当W比R跑得快,追到距离R还有一个元素间隔的时候,就认为环已经满。当环内元素占用的存储空间较大的时候,这种办法显得很土(浪费空间)。

办法2:维护额外变量

如果不喜欢上述办法,还可以采用额外的变量来解决。比如可以用一个整数记录当前环中已经保存的元素个数(该整数>=0)。当R和W重叠的时候,通过该变量就可以知道是“空”还是“满”。

◇元素的存储

由于环形缓冲区本身就是要降低存储空间分配的开销,因此缓冲区中元素的类型要选好。尽量存储值类型的数据,而不要存储指针(引用)类型的数据。因为指针类型的数据又会引起存储空间(比如堆内存)的分配和释放,使得环形缓冲区的效果打折扣。

★应用场合

刚才介绍了环形缓冲区内部的实现机制。按照前一个帖子的惯例,我们来介绍一下在线程和进程方式下的使用。

如果你所使用的编程语言和开发库中带有现成的、成熟的环形缓冲区,强烈建议使用现成的库,不要重新制造轮子;确实找不到现成的,才考虑自己实现。如果你纯粹是业余时间练练手,那另当别论。

◇用于并发线程

和线程中的队列缓冲区类似,线程中的环形缓冲区也要考虑线程安全的问题。除非你使用的环形缓冲区的库已经帮你实现了线程安全,否则你还是得自己动手搞定。线程方式下的环形缓冲区用得比较多,相关的网上资料也多,下面就大致介绍几个。

对于C++的程序员,强烈推荐使用boost提供的circular_buffer模板,该模板最开始是在boost 1.35版本中引入的。鉴于boost在C++社区中的地位,大伙儿应该可以放心使用该模板。

对于C程序员,可以去看看开源项目circbuf,不过该项目是GPL协议的,不太爽;而且活跃度不太高;而且只有一个开发人员。大伙儿慎用!建议只拿它当参考。

对于C#程序员,可以参考CodeProject上的一个示例。

◇用于并发进程

进程间的环形缓冲区,似乎少有现成的库可用。大伙儿只好自己动手、丰衣足食了。

适用于进程间环形缓冲的IPC类型,常见的有共享内存和文件。在这两种方式上进行环形缓冲,通常都采用数组的方式实现。程序事先分配好一个固定长度的存储空间,然后具体的读写操作、判断“空”和“满”、元素存储等细节就可参照前面所说的来进行。

共享内存方式的性能很好,适用于数据流量很大的场景。但是有些语言(比如Java)对于共享内存不支持。因此,该方式在多语言协同开发的系统中,会有一定的局限性。

而文件方式在编程语言方面支持很好,几乎所有编程语言都支持操作文件。但它可能会受限于磁盘读写(Disk I/O)的性能。所以文件方式不太适合于快速数据传输;但是对于某些“数据单元”很大的场合,文件方式是值得考虑的。

对于进程间的环形缓冲区,同样要考虑好进程间的同步、互斥等问题,限于篇幅,此处就不细说了。

转载于:https://my.oschina.net/xiaomaoandhong/blog/261202

架构设计:生产者/消费者模式 第6页:环形缓冲区的实现相关推荐

  1. 架构设计:生产者/消费者模式 第3页:队列缓冲区

    2019独角兽企业重金招聘Python工程师标准>>> [2]:队列缓冲区 经过前面两个帖子的铺垫,今天终于开始聊一些具体的编程技术了.由于不同的缓冲区类型.不同的并发场景对于具体的 ...

  2. Java并发编程实战~生产者-消费者模式

    前面我们在<Worker Thread 模式>中讲到,Worker Thread 模式类比的是工厂里车间工人的工作模式.但其实在现实世界,工厂里还有一种流水线的工作模式,类比到编程领域,就 ...

  3. java 消费者模式 多线程_[Java并发-24-并发设计模式] 生产者-消费者模式,并发提高效率...

    生产者 - 消费者模式在编程领域的应用非常广泛,前面我们曾经提到,Java 线程池本质上就是用生产者 - 消费者模式实现的,所以每当使用线程池的时候,其实就是在应用生产者 - 消费者模式. 当然,除了 ...

  4. delphi生产者消费者模式代码_并发设计模式:生产者-消费者模式,并发提高效率...

    生产者 - 消费者模式在编程领域的应用非常广泛,前面我们曾经提到,Java 线程池本质上就是用生产者 - 消费者模式实现的,所以每当使用线程池的时候,其实就是在应用生产者 - 消费者模式. 当然,除了 ...

  5. 生产者消费者模式-java原生、Disruptor实现方案

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

  6. 并发编程(五)python实现生产者消费者模式多线程爬虫

    并发编程专栏系列博客 并发编程(一)python并发编程简介 并发编程(二)怎样选择多线程多进程和多协程 并发编程(三)Python编程慢的罪魁祸首.全局解释器锁GIL 并发编程(四)如何使用多线程, ...

  7. 生产者消费者模式详解(转载)

    ★简介 在实际的软件开发过程中,经常会碰到如下场景:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类.函数.线程.进程等).产生数据的模块,就形象地称为生产者:而处理 ...

  8. 面试官让我手写一个生产者消费者模式?

    不知道你是否遇到过面试官让你手写生产者消费者代码.别说,前段时间有小伙伴还真的遇到了这种情况,当时是一脸懵逼. 但是,俗话说,从哪里跌倒就要从哪里爬起来.既然这次被问到了,那就回去好好研究一下,争取下 ...

  9. java消费者模式_基于Java 生产者消费者模式(详细分析)

    生产者消费者模式是多线程中最为常见的模式:生产者线程(一个或多个)生成面包放进篮子里(集合或数组),同时,消费者线程(一个或多个)从篮子里(集合或数组)取出面包消耗.虽然它们任务不同,但处理的资源是相 ...

最新文章

  1. java hanoi_Hanoi问题java解法
  2. Coursera课程Python for everyone:Quiz: Many-to-Many Relationships and Python
  3. php 4位数字不足补零,php实现数字不足补0的方法
  4. python面试总结(二)列表去重与单例
  5. MinGW 编译zlib libpng libjpeg等
  6. EclipseLink+H2 快速搭建JPA开发环境
  7. 我们一家三口不和双方父母来往了怎么办?
  8. ubuntu+nginx+php-cgi 环境开启php的curl功能
  9. Arduino下载与配置
  10. 神思SS628(100)型第二代身份证验证阅读机具二次开发
  11. 大数据新闻推送你怎么看_如何看待大数据精准推送,使人的视界越来越窄?
  12. python爬虫---拉勾网与前程无忧网招聘数据获取(多线程,数据库,反爬虫应对)
  13. PE装错盘,装到移动硬盘的资料恢复办法
  14. sticky 失效问题
  15. ICCV 2021 口罩人物身份鉴别全球挑战赛冠军方案分享
  16. 怎样压缩Word文档,Word压缩技巧分享
  17. 如何快速地向服务器传大文件,大文件如何快速传输
  18. OC8051内部逻辑分析(1)
  19. ISO 18061精细陶瓷(高级陶瓷高级工业陶瓷)--半导性光催化材料抗病毒活性测定—细菌噬菌体法
  20. 火山引擎:数字化时代,如何给金融业注入“内容活水”?

热门文章

  1. NFS安装系统及PS1设定
  2. java basedaoimpl_java web项目DAO层通用接口BaseDao与实现类BaseDaoImpl
  3. html 打印时隐藏,html 打印相关操作与实现详解
  4. go kegg_3分钟了解GO/KEGG功能富集分析
  5. 带你理清Node.js 的Web框架的3个层次
  6. C 语言中” 与””的区别
  7. 简述Linux C下线程池的使用
  8. 机械转嵌入式还是java,机械硕士转嵌入式后悔吗?
  9. CSS中表格的一些属性和使用
  10. CF911G Mass Change Queries (线段树区间 合并)