使用stl的queue实现线程安全队列

2019-09-09
阅读 4 分钟
7.4k
近日有朋友问起线程安全队列的问题。本文基于stl的queue容器实现了线程安全的队列,可多线程生产,多线程消费。同时与基于boost的circular_buffer实现的环形缓冲区相比较,性能略优(实验测试下来优势也不大,不到5%)。源码比较简单,使用stl和boost实现,并且实现了超过队列最大长度丢弃消息的功能。

访问者模式

2019-09-03
阅读 3 分钟
1.4k
学校里有操场,教室,访问者可以为学生和老师,学生在教室学习,老师在教课,学生在操场玩耍,老师在监督,各个类请先自己思考。实现如下访问者相关类,visitor.h

模板模式

2019-09-03
阅读 2 分钟
1.2k
模板模式,在基类中定义了算法(一系列步骤)的骨架,在一些子类中推迟了某些步骤的实现。模板模式让子类重新定义了一些步骤,而不用改变算法的骨架。

策略模式

2019-09-03
阅读 2 分钟
1.3k
策略模式比较常见。人总要学习,正如在开篇中所说,通过读可以,写效果更好,能够通过分享或者教会别人可能会更有效。策略相关类,strategy.h

状态模式

2019-09-01
阅读 2 分钟
1.2k
简介 状态模式,指当一个对象的内部状态发生改变时,允许改变它的行为。 UML类图 示例 这里我们使用播放器的播放和停止两个状态来模拟状态模式,如下:状态类,state.h {代码...} 状态类实现,state.cpp {代码...} 客户端调用,main.cpp {代码...} 输出如下: {代码...}

观察者模式

2019-09-01
阅读 3 分钟
1.3k
观察者模式,定义了对象间一对多的关系,当被观察者的状态改变时,它所依赖的所有对象都会被更新和通知。观察者模式在实际应用中较多,例如各种订阅的实现都有观察者的应用,mvc复合模式也使用了观察者。

备忘录模式

2019-09-01
阅读 2 分钟
1.1k
简介 备忘录模式,不需要违反封装,捕获这个对象的状态,并且在外部保存对象的内部状态,以使对象可以恢复到之前的状态。 UML类图 示例 word编辑器提供了undo功能,在这里我们可以简单模拟一下此功能的实现,只显示最近的一个单词。备忘录相关类,memento.h {代码...} 调用者,main.cpp {代码...} 输出如下: {代码...}

中介者模式

2019-09-01
阅读 3 分钟
1.3k
中介者模式,定义了一个封装了很多交互者的对象,中介者不需要交互者之间彼此显示的引用,并且可以独立地改变它们的交互。将对象之间N对N的关系,简化成了1对N的关系。现实中的中介者也很多,有房产中介,黄牛,媒人等。

迭代器模式

2019-09-01
阅读 3 分钟
1.3k
迭代器模式,提供一种方法访问聚合对象中的各个元素,而不需要暴露它的内部实现。迭代器模式在stl的容器中被普遍使用,实际开发中自己实现一个迭代器并不多见,使用居多。

解释器模式

2019-08-31
阅读 3 分钟
1.4k
解释器模式的定义是对于指定的语言,定义它的语法,并定义一个解释器,使用该语法来解释句子。解释器模式的使用的范围比较小,因此使用并不多见。多常用于词法解析,例如sql语句解析,正则表达式解析,编译器语法解析,计算表达式解析等。

命令模式

2019-08-31
阅读 2 分钟
1.4k
命令模式,将一个请求封装成一个对象,因此你可以将不同的请求封装成不同的对象,实现调用操作的对象和实际处理的对象之间的解耦;对请求排队或者记录日志,以及支持可撤销操作。

责任链模式

2019-08-31
阅读 2 分钟
1.3k
责任链模式,使责任链上的每个对象都有机会处理请求,避免请求的发送者和接收者耦合在一起。将接收对象链接起来,把请求沿着这条链传递,直到有对象可以处理它。

代理模式

2019-08-30
阅读 1 分钟
1.3k
有句广告词,没有中间商赚差价,这个中间商很多时候就是代理的角色。中间商越多就是层层代理。很多商品都有一级代理商二级代理商等。在这里我们举一个火车票代售点的故事。代理实现,proxy.h

享元模式

2019-08-30
阅读 2 分钟
1.5k
享元模式的英文名是flyweight,在体育运动中指轻量级的,它使用共享支持大量细粒度对象的复用。享元模式避免了大量对象的创建,因此节省了很多内存空间。

外观模式

2019-08-29
阅读 1 分钟
1.4k
外观模式将一系列子系统中的接口统一成标准的接口,外观模式提供了高水平的接口,使子系统更容易使用。外观模式在设计中经常可见,它方便了客户端的调用。

装饰者模式

2019-08-29
阅读 2 分钟
1.2k
装饰者模式可以动态地给一个对象添加行为,相对通过继承来扩展功能,它是一个灵活的选择。装饰者模式也使用了继承,只是为了统一接口,如果去除CDecorator和CComponent的继承关系,就有些像桥接模式了。主要区别是装饰者不需要动态的改变被装饰的对象,而桥接模式是多个维度独立的变化。

组合模式

2019-08-29
阅读 3 分钟
1.3k
组合模式是用在树状结构中,表示部分和整体的层次结构,组合模式使客户端同等对待对象(叶子节点)和对象的组合(容器)。也分为透明组合模式和安全组合模式,透明组合模式实现了父类的所有方法,安全组合模式不实现管理叶子节点的接口。本文只记录透明组合模式。

桥接模式

2019-08-28
阅读 2 分钟
1.3k
桥接模式是将它的抽象部分和实现部分分离,使它们可以独立的变化。抽象部门和实现部分是独立的,通过它们的组合可以派生出很多不同类型的对象。在一个系统内如果有两个独立变化的维度,使用桥接模式可以减少类的数量。

适配器模式

2019-08-28
阅读 1 分钟
1.2k
在面向过程的编程中,我们也经常会遇到接口不一致的情况,此时需要对原先的接口进行包装或适配。在面向对象中,适配器模式是指将一个类的接口转换成客户期望的接口,适配器模式让之前由于接口不兼容的类可以一起工作。它有两种方式,一种是类适配器,一种是对象适配器模式,我们只介绍对象适配器模式。

单例模式

2019-08-28
阅读 1 分钟
1.1k
单例模式只允许一个类有一个实例化。其应用比较广泛,很多情况下我们只需要一个对象。主要要点是:构造函数私有,包含指向该类的静态成员指针,实例化的静态函数。实现时为了保证只有一个实例,需要使用锁保证同步,或者初始化全局变量等技术保证唯一实例。我们只实现使用锁的方法。

原型模式

2019-08-27
阅读 1 分钟
1.2k
原型模式通过对已有对象进行复制来创建新的对象,主要是通过拷贝构造函数来实现。其类结构图也比较简单,拷贝构造函数来确定clone的时候是深拷贝还是浅拷贝。在java的基类Object中,就包含clone方法。

工厂方法模式

2019-08-27
阅读 2 分钟
1.4k
工厂方法模式可以看作是抽象工厂模式的一个特例,当抽象工厂模式创建的产品个数为1时,就成了工厂方法模式。工厂方法模式定义了创建一个对象的接口,由子类来决定实例化的类型。

建造者模式

2019-08-27
阅读 2 分钟
1.2k
大飞机可以说是一个很复杂的对象了,它里面集成了各种各样的系统。假设我们简单抽象分为发动机,机身,机翼,起落装置等。我们在此写一个模拟创造大飞机的小游戏。

抽象工厂模式

2019-08-26
阅读 3 分钟
1.5k
曾经,日本制造代表着制造的先进水平(现在很多领域依然如此)。虎牌,象印等品牌生产的保温杯,电饭煲深受消费者的喜爱,并且消费者很关注这些产品的产地。现在,你作为他们的代理商(类似于天猫京东),销售他们的产品,满足消费者的需求。

设计模式浅析(C++)

2019-08-26
阅读 1 分钟
1.6k
设计模式对于软件开发人员来说,重要性不言而喻。使用设计模式的主要目的是使软件可维护,扩展性好。它提供了一套方法来匹配我们开发中经常遇到的一些场景,GOF四人组提出了最初的23种设计模式,至今还在被许多人使用。然而我们很多时候,优先实现功能,设计在后,很多时候忽略了设计模式,从而导致软件的可维护性较差,...

linux下进程锁重入导致的死锁

2019-08-09
阅读 1 分钟
3.7k
一.问题现象 客户端收不到服务端的请求,查看服务端不再响应。现将定位过程记录如下。 二.问题调试过程 使用gdb attach上该服务的进程后,发现有工作线程卡在了锁的获取上,如图 该进程的15号线程,停在了获取锁上,切到该线程的第3帧,查看该信号量的信息,如图 使用命令ipcs -s -i 35848295查看占有该信号量的线程,输...

wireshark为什么会卡死?

2019-07-30
阅读 1 分钟
9.4k
近日在使用wireshark抓包的时候,该工具时不时的会卡死,什么原因导致的,想起了可以用调试利器windbg来跟踪一下。 一.调试准备 首先查看wireshark的版本,然后到wireshark官网上下载下来对应的pdb文件。以管理员运行windbg,设置好符号文件路径。 二.调试过程 当wireshark出现卡死的时候,使用windbg,attach上wireshar...

opc的进程是哪个?

2019-07-29
阅读 1 分钟
1.4k
近日在研究opc ua协议,此协议是在opc协议上进一步发展的,遂好奇,opc发布的服务是哪个进程?之前我们开发的软件中有实现opc发布,对此进行了初步探索以记录。

linux下文件描述符限制

2019-07-05
阅读 1 分钟
1.6k
问题过去有段时间了,忘记当时怎么想到是超过文件描述符限制了。大概是根据句柄的值或者返回的错误码了。嗯。linux下文件描述符最大限制默认最大为1024,通过

内存泄漏的分析

2019-07-01
阅读 3 分钟
1.4k
如果问题很容易出现,最好是使用umdh工具来进行判断,此工具的使用方法在其帮助手册中有详细介绍,此处不再赘述。本文中说的是另外一处思路。众所周知,进程中分为代码空间,数据空间,栈,堆等。除了堆之外,其他部分都是基本固定和有上限限制的。堆的空间大小对于64位的进程可以说基本不受限的,因此我们的思路是查看...