PF2.1版本总结,在设计过程中遇到的问题以及技术分享

  在距离上一次的版本发布已经过去4个月的时间,因为个人的能力以及时间有限,所以这次的版本会推迟这么久。可是无论怎样,PF2.1带着自身的完善总算不负所望推出。在这次的版本调整中让我深有体会到了程序设计中的几大问题:安全、性能、稳定。如何设计出一个高效稳定的框架时,自然需要对所运用的语言的熟知,在这期间我一直参考了《effective c++》这本对C++语言总结的十分详细的资料,结合了最新C++11的新特性。

版本更新

  1、增加:cache模块

  2、增加:lua插件中的dcache模块

  3、增加:对应的windows专用版本仓库

  4、优化:利用C++11新特性修改basic的type::variable_t的实现机制

  5、优化:动态分配内存类修改、替换数据库查询中的结果缓存数据为堆的实现方式(之前栈的方式会导致windows栈溢出)

  6、修复:share::Map、share::lock/unlock、db::Query在多线程不能正常工作的问题

  在这次的版本中遇到的最多问题是多线程下以及windows平台上兼容的问题,深刻体会到VC的实现与GNU的区别。虽然平台之间存在兼容性,可是一些硬性的C++标准是不会有什么区别的。对于存在的问题,该版本进行了大刀阔斧的修正,绝对没有存在任何侥幸和姑息。我将从以下几个方面来分享:共享锁、泛型编程、线程池。

共享锁

  共享锁的实现目的是为了在同时访问这些公用的内存时数据的正确性,这与多线程中的锁是类似的。不过共享锁的实现是以std::atomic的CAS(compare_exchange_weak)方式实现的,这方面可以查询一下相关的资料,当然这是在C++11标准中的,旧的标准没有。

  在pf_cache::DbStore以及核心的share::Map中我都用到了共享锁,当前这个共享锁的实现可能并不完美,不过在测试下可以进行正常的工作。

  std::atomic的数据是在共享内存中存在的,因此在我们队单个对象节点(node)进行操作时需要保证它是被正确修改的,即锁的本身需要保证安全和可靠。同时最重要一点的是我们再进行一个整体操作时,比如share::Map中删除一个数据需要涉及到内部内存的变动,那么这整个改变应该是唯一的,因此在这过程中我们需要全程加锁,避免另一个删除操作(多线程)修改我们这些数据,导致操作内存的混乱错误。

泛型编程

  什么是泛型编程?

  我们要理解它的含义,那么我们可以看一个类型,那就是void *,它表示什么意思呢?我们可以称它为空指针,同时它还有另一个名字:泛型指针。

  为什么void *被叫做泛型指针呢?想想我们用它的场景,应该不难发现,它的最大作用时表示任何的指针,它可以很轻松的转换为你想要的类型,因此它本身是与类型没有任何关系的。

  泛型编程和void *指针一样,它本身是和类型无关的,原则上是通用的。而在C++中的实现方式,是以类(结构体)和函数模板(template)的方式。

  本次版本中就使用了模板的方式重构了type::variable_struct,从原来约1500行代码缩短到约600行,这可见泛型编程的优越。

  不过在模板中我觉得需要注意的是模板特化的实现方式,这一点可以查找相关资料即可。

线程池

  提到池的概念,有许多人可能会想到内存池,这是因为我们在学习过程中许多书籍上都会有相关的介绍。线程池的概念却有些区别,虽然它也是一个相当于存储许多线程的容器,不过我认为它更像一个工作小组。

  我们之所以要用到多线程和线程池的原因,就是为了充分利用机器的线程优势,就好比原来只有一个人做的工作,现在分摊到许多人的身上,自然这样的工作效率是成倍的提升的。而PF现在的线程池在类pf_sys::ThreadPool中,是一位开源贡献者实现的。它利用了C++的新特性,在线程池构造时便创建了许多的工作线程,并让它们进入休眠中,当有一个新的任务时,它会利用线程条件通知的方式唤醒线程进行工作。

  在pf_cache::DbStore中的waitquery便使用了线程池,有兴趣的可以去查看,自然也欢迎大家能指正错误。

附录

  github for linux:  https://github.com/viticm/plainframework

  github for windows: https://github.com/viticm/pf_win

  讨论QQ群: 348477824

时间: 2024-10-11 00:49:45

PF2.1版本总结,在设计过程中遇到的问题以及技术分享的相关文章

C++类设计过程中的原则(总结)

一.由编译器生成的成员函数 1)默认的构造函数 默认构造函数定义为没有参数,或者有默认的参数值.当用户自己未定义时,系统可以提供. 自动生成的默认构造函数,会调用继承的基类的默认构造函数来构造派生类的基类部分. 若Star是一个类,则 Star orig; Star array[6];都将需要默认构造函数. 如果自己定义了构造函数,则系统不会再生成默认构造函数,这个时候最好自己要定义一个默认构造函数. 构造函数 -- [确保对象的生成] -- 最好提供显式的默认构造函数,以确保对象能够正确的初始

界面设计过程中的常用字体规范

好长时间没发帖,净想过年了,过年哈,倒腾工作总结和年货是大事. 这几天有人问我说:“最近看了好多教程,都老高大上了,但是老弟我做不到呀,想学点直接能拿来用的,这个要求过分吗……” 这个,好吧,那就直接说说能用的知识:字体字号. 也许你会说:字体字号?也太Low了吧,这个谁不知道重要呀. 对于这个问题,我想说:会和熟练,是两回事.一个App,不同部分的字体字号你能准确地说出来吗? 很多刚做APP界面的设计师,经常会因为字号,字体颜色,间距而困扰. 拿到设计需求后,开始进行设计,不知道从何去调整界面

CDN高级技术专家周哲: 深度剖析短视频分发过程中的用户体验优化技术点

2018深圳云栖大会已经圆满落幕,在飞天技术汇-弹性计算.网络和CDN专场中,阿里云CDN高级技术专家周哲为我们带来了<海量短视频极速分发>的主题分享,带领我们从视频内容采集.上传.存储和分发的角度介绍整体方案,并且重点讲解短视频加速的注意事项和用户体验优化要点. 讲解从三个部分展开:短视频应用场景,阿里云短视频解决方案,阿里云对短视频用户体验优化的相关优化. 短视频应用场景 短视频比图片和文字包含更多的信息,在移动互联网普及的今天,短视频应用场景非常广泛. 一. 社群分享场景用户可以录制视频

CDN高级技术专家周哲:深度剖析短视频分发过程中的用户体验优化技术点

深圳云栖大会已经圆满落幕,在3月29日飞天技术汇-弹性计算.网络和CDN专场中,阿里云CDN高级技术专家周哲为我们带来了<海量短视频极速分发>的主题分享,带领我们从视频内容采集.上传.存储和分发的角度介绍整体方案,并且重点讲解短视频加速的注意事项和用户体验优化要点. 讲解从三个部分展开:短视频应用场景.阿里云短视频解决方案.阿里云对短视频用户体验的相关优化. 短视频应用场景 短视频比图片和文字包含更多的信息,在移动互联网普及的今天,短视频应用场景非常广泛. 一. 社群分享场景 用户可以录制视频

浅谈企业应用软件架构设计过程

1.引言 本文不是学术性文章,也不是某些标准化理论的阐述,而是根据所从事J2EE应用软件架构设计工作的经验,谈谈自己对软件架构设计过程的理解,希望能让一些徘徊于门口的同学能对企业应用软件架构设计的目标.价值与方法有个大致概念.文中所举例子及分析方法受个人经验背景约束,可能在一定程度上会存在误导性,软件架构设计过程大同小异,例子主要还是用于辅助说明设计过程. 对于架构设计,如果用建筑来比拟的话,有点类似这样:这是我们将修建一座大教堂,甲方有这样的一些特殊要求,比如大堂要能容纳5000人,中间不能有

从涂鸦到发布——理解API的设计过程(转)

英文原文:From Doodles to Delivery: An API Design Process 要想设计出可以正常运行的Web API,对基于web的应用的基本理解是一个良好的基础.但如果你的目标是创建出优秀的API,那么仅凭这一点还远远不够.设计优秀的API是一个艰难的过程,如果它恰巧是你当前的工作任务,那么你很可能会感到手足无措. 不过,优秀的设计绝对是可以实现的.本文所描述的流程将帮助你获得成功,我们将共同研究什么是优秀的设计,以及迭代式的流程如何帮助我们实现这一目标.我们还将叙

需求与设计过程(1)-用例(转)

1.前言 看过太多的称得上“三无”的软件,就是无需求.无设计.无注释.严格的说来,他们的需求和设计其实还是有的,只是没有用文档记录下来而已,但是注释确实真的没有.这些软件从大到小都有,但是他们都有一个共同的特点,就是“难维护”.前几天和同事聊天,听说一个XAML的实现要重写了,用本地协议代替,然后再去考虑和XAML兼容.虽然我没有看过这个项目的代码,但是我知道这个项目基本也是“三无”.当然这个情况也是三无的重大特征之一,就是前脚走人之后,后脚是“看不懂.下不了手”,结果是还不如重写来得简单.从员

真屏实据丨数据大屏设计实战—揭秘企业级数据大屏设计过程

本文来自网易云社区 作者: 魏辛逸 图片: "网易有数"可视化平台 大屏是我们用来分享.沟通.传播信息的有效途径之一.它将会进化成一种新的媒体形式,在品牌推广.政务接待.商业沟通.数据监控等各个场景发挥重要作用.本文主要整理了一些大屏设计过程中的方法和原则,希望能够为大家提供一些借鉴思路. 大屏是什么? 大屏设计是最近比较流行的概念,一般按照功能来分有几种: 1. 可交互的触摸屏,大多运用在互动教学课程或者报告演示现场,用户可结合交互操作来阐述具体内容.设计师需要对交互形式和传达内容作

SAP HANA项目过程中优化分析以及可行性验证

在项目开发过程中,经常会遇到HANA模型运行效率的问题: 以我们项目为例,HANA平台要求模型运行时间不能超过10秒,但是在大数量和计算逻辑复杂的情况下(例如:ERP中的BKPF和BSEG量表的年数据总量超过20亿条),HANA模型的运行时间基本上都在1分钟以上.在不关联其它表,单单是几个板块的BKPF和BSEG表UNION ALL,运行时间都超过1分钟.鉴于这种情况,项目组对HANA模型是否存在优化空间,进行了分析和探讨,也请教了HANA平台的专家对HANA的优化给出可行性建议. 最终的分析结