设计模式
yifuteli
这个作者很懒,什么都没留下…
展开
-
生产者/消费者模式 (一)“生产者/消费者模式”介绍
★简介 在实际的软件开发过程中,经常会碰到如下场景:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类、函数、线程、进程等)。产生数据的模块,就形象地称为生产者;而处理数据的模块,就称为消费者。 单单抽象出生产者和消费者,还够不上是生产者/消费者模式。该模式还需要有一个缓冲区处于生产者和消费者之间,作为一个中介。生产者把数据放入缓冲区,而消费者从转载 2013-10-04 13:27:19 · 1610 阅读 · 0 评论 -
生产者/消费者模式(二)如何确定数据单元
另外,为了方便阅读,把本系列帖子的目录整理如下: 1、如何确定数据单元 2、队列缓冲区 3、队列缓冲区 4、双缓冲区 [1]:如何确定数据单元? 既然前一个帖子已经搞过扫盲了,那接下来应该开始聊一些具体的编程技术问题了。不过在进入具体的技术细节之前,咱们先要搞明白一个问题:如何确定数据单元?只有把数据单元分析清楚,后面的技术设计才好搞。转载 2013-10-04 13:28:50 · 894 阅读 · 0 评论 -
生产者/消费者模式(三)队列缓冲区
[2]:队列缓冲区 经过前面两个帖子的铺垫,今天终于开始聊一些具体的编程技术了。由于不同的缓冲区类型、不同的并发场景对于具体的技术实现有较大的影响。为了深入浅出、便 于大伙儿理解,咱们先来介绍最传统、最常见的方式。也就是单个生产者对应单个消费者,当中用队列(FIFO)作缓冲。 关于并发的场景,在之前的帖子“进程还线程?是一个问题!”中,已经专门论述了进程和线程各自的优缺点,两者皆转载 2013-10-04 13:29:57 · 2056 阅读 · 0 评论 -
生产者/消费者模式 (四)注意事项
顺便补充几个注意事项,大伙儿留意一下: 1、对stdio进行读写操作是以阻塞方式进行。比如管道中没有数据,消费者进程的读操作就会一直停在哪儿,直到管道中重新有数据。 2、由于stdio内部带有自己的缓冲区(这缓冲区和管道缓冲区是两码事),有时会导致一些不太爽的现象(比如生产者进程输出了数据,但消费者进程没有立即读到)。具体的细节,大伙儿可以看"这里"。 ◇SOCKET转载 2013-10-04 13:30:46 · 1151 阅读 · 0 评论 -
生产者/消费者模式(五)环形缓冲区
[3]:环形缓冲区 前一个帖子提及了队列缓冲区可能存在的性能问题及解决方法:环形缓冲区。今天就专门来描述一下这个话题。 为了防止有人给咱扣上“过度设计”的大帽子,事先声明一下:只有当存储空间的分配/释放非常频繁并且确实产生了明显的影响,你才应该考虑环形缓冲区的使 用。否则的话,还是老老实实用最基本、最简单的队列缓冲区吧。还有一点需要说明一下:本文所提及的“存储空间”,不仅包括内存转载 2013-10-04 13:31:29 · 2336 阅读 · 0 评论 -
生产者/消费者模式 (六) 环形缓冲区的实现
◇判断“空”和“满” 上述的操作并不复杂,不过有一个小小的麻烦:空环和满环的时候,R和W都指向同一个位置!这样就无法判断到底是“空”还是“满”。大体上有两种方法可以解决该问题。 办法1:始终保持一个元素不用 当空环的时候,R和W重叠。当W比R跑得快,追到距离R还有一个元素间隔的时候,就认为环已经满。当环内元素占用的存储空间较大的时候,这种办法显得很土(浪费空间)。转载 2013-10-04 13:33:00 · 1695 阅读 · 0 评论 -
XML、JSON、PB(protocol buffer)的比较
原创 2013-10-04 14:09:17 · 1772 阅读 · 0 评论