在距离上一次的版本发布已经过去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 windows: https://github.com/viticm/pf_win
  讨论QQ群: 

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

  1. 用友ERP-U8最新破解(再次更新版本,附安装过程中的解决办法)

    新版用友u8.70下载地址:http://ftp.shangyuchem.com/应用软件/用友ERP-U8管理软件(8.70版).rar 准备好安装环境,因为需要SQLSERVER和IIS支持,而个 ...

  2. [学习笔记] Web设计过程中该做和不该做的

    原文网址: http://www.javascriptstyle.com/the-dos-and-donts-of-web-design -该做的: QR代码QR代码即快速响应代码,这是矩阵条形码的一 ...

  3. [.NET跨平台]Jeuxs独立版本的便利与过程中的一些坑

    本文环境与前言 之前写过一篇相关的文章:在.NET Core之前,实现.Net跨平台之Mono+CentOS+Jexus初体验 当时的部署还是比较繁琐的,而且需要联网下载各种东西..有兴趣的可以看看, ...

  4. [.NET跨平台]Jexus独立版本的便利与过程中的一些坑

    本文环境与前言 之前写过一篇相关的文章:在.NET Core之前,实现.Net跨平台之Mono+CentOS+Jexus初体验 当时的部署还是比较繁琐的,而且需要联网下载各种东西..有兴趣的可以看看, ...

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

    深圳云栖大会已经圆满落幕,在3月29日飞天技术汇-弹性计算.网络和CDN专场中,阿里云CDN高级技术专家周哲为我们带来了<海量短视频极速分发>的主题分享,带领我们从视频内容采集.上传.存储 ...

  6. 在APP开发设计过程中:如何设计启动页面?

    心理学上有一个“7秒理论”,说的是,一个人对另一个人的印象,在初次见面的七秒内就会形成,最近更有研究表明,这个时间可能更短——不到1秒.所以初次见面所展示的形象真的很重要.同理,用户在使用APP时,每 ...

  7. rtmp直播拉流客户端EasyRTMPClient设计过程中时间戳问题汇总

    EasyRTMPClient 简介 EasyRTMPClient是EasyDarwin流媒体团队开发.提供的一套非常稳定.易用.支持重连接的RTMPClient工具,以SDK形式提供,接口调用非常简单 ...

  8. AD设计过程中的注意事项

    1.编译报错:off sheet at....是纸张太小的原因,选择大一点的纸张报错就会消失.

  9. 记录ubuntu16.04版本安装过程中遇到的问题

    记录ubuntu16.04版本安装和使用过程中遇到的些问题,方便以后查看,主要内容有: 1. ubuntu源替换 2. windows与vmware ubuntu文件夹共享 3. putty连接ubu ...

随机推荐

  1. 表格组件神器:bootstrap table详细使用指南

    1.bootstrap-table简介 1.1.bootstrap table简介及特征: Bootstrap table是国人开发的一款基于 Bootstrap 的 jQuery 表格插件,通过简单 ...

  2. Vxlan与网卡offload性能

    背景 由于数据链路层MTU的限制,发送端TCP/UDP数据在交付到IP层时需要与MTU相匹配,TCP数据不能超过mss,较长的UDP需要分片(Fragmentation)以满足MTU要求:接收端协议栈 ...

  3. 【DevExpresss】3、LookUpEdit详解(转载)

    [DevExpresss]3.LookUpEdit详解 哈,今天又用到了LookUpEdit控件,主要是用来实现模糊查询和自由输入功能,然而由于长时间没用了,一阵手忙脚乱的,这里把网上收集的一部分教程 ...

  4. ADO.NET 获取SQL SERVER数据库架构信息

    1.确定可用字段数目 sqlDataReader类提供了FieldCount属性,可确定查询反悔了多少个字段. 2.确定返回行的数目 sqlDataReader中没有指示可用行的属性. 3.确定字段的 ...

  5. JS实现排序

    排序算法可以分为内部排序和外部排序.内部排序是数据记录在内存中进行排序,外部排序是因排序的数据很大,一次不能够容纳全部的排序记录,在排序中需要访问外存.常见的内部排序算法有插入排序,选择排序,冒泡排序 ...

  6. bzoj4828 [Hnoi2017]大佬

    Description 人们总是难免会碰到大佬.他们趾高气昂地谈论凡人不能理解的算法和数据结构,走到任何一个地方,大佬的气场就能让周围的人吓得瑟瑟发抖,不敢言语.你作为一个OIER,面对这样的事情非常 ...

  7. 经验分享:如何用grep对PHP进行代码审计

    这是一个常见的误解- 企业需要购买复杂和昂贵的软件来发现应用程序中安全漏洞:而这些专门的软件应用程序,无论是黑盒或白盒,开源或商业,都能很快的发现安全漏洞. 事实是:所有这些专业的漏洞扫描工具都有其特 ...

  8. 系统启动 之 Linux系统启动概述(1)

    随着智能终端功能的越来越庞大,与之,硬件配置越来越高,开机时间却越来越长.人们在享受强大功能的同时,对冗长的智能终端的开机时间却越来越缺乏耐心. 为了"取悦"用户,需要提供较好的用 ...

  9. PhpMyAdmin导入数据库大小限制?

    问题描述: 在phpMyAdmin中导入数据库时,出现问题: 1. 如果按照扩展名.sql导入,提示如下: 没有接收到要导入的数据.可能是文件名没有提交,也可能是文件大小超出 PHP 限制. 2. 如 ...

  10. .bind.apply() 解决 new 操作符不能用与 apply 或 call 同时使用

    背景: 小明想要用数组的形式为 Cls.func 传入多个参数,他想到了以下的写法: var a = new Cls.func.apply(null, [1, 2, 3]); 然而浏览器却报错Cls. ...