自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

方亮的专栏

方亮的专栏

原创 谈代码注释

只要写代码,就会遇到代码注释的问题。在不同的公司,不同的项目组,不同的项目中,可能会有不同的注释标准。有些标准让我们感觉很受益,有些则让我们感觉很反感。而对于没有明确标准的项目,我们往往会遇到“百花齐放,百家争鸣”般的注释。我无法给出一个明确的标准,只是在此探讨下:什么样的注释不应该写,什么地方需...

2018-04-01 01:24:25 6878 7

原创 AWS攻略——使用CodeCommit托管代码

除了我们熟悉的github,各大云厂商也有自己的代码托管服务。本文讲解如何在Amazon的CodeCommit中托管代码。 根账户登录 AWS有两种账户登录界面。 IAM账户登录界面 根账户登录界面 我们先使用根账户登录。 IAM 我们需要定...

2020-03-03 23:00:30 244 0

原创 bug诞生记——信号(signal)处理导致死锁

这个bug源于项目中一个诡异的现象:代码层面没有明显的锁的问题,但是执行时发生了死锁一样的表现。我把业务逻辑简化为:父进程一直维持一个子进程。(转载请指明出于breaksoftware的csdn博客) 首先我们定义一个结构体ProcessGuard,它持有子进程的ID以及保护它的的锁。这样...

2019-09-05 23:35:09 313 0

原创 bug诞生记——不定长参数隐藏的类型问题

这个bug的诞生源于项目中使用了一个开源C库。由于对该C库API不熟悉,一个不起眼的错误调用,导致一系列诡异的问题。最终经过调试,我们发现发生了内存覆盖问题。为了直达问题根节,我将问题代码简化如下(转载请指明出于breaksoftware的csdn博客) #include <iostre...

2019-04-25 20:59:06 735 0

原创 C++拾取——stl标准库中集合交集、并集、差集、对称差方法

STL库中有丰富的集合运算方法,我们可以使用它们快速完成交集、并集、差集、对称差集的运算。(转载请指明出于breaksoftware的csdn博客) 交集(intersection) 交集是集合运算中经常会用到的计算,其表达是两个集合共有的部分(图中红色区域) STL中有...

2019-04-02 23:44:00 1950 0

原创 使用libev监视文件夹下文件(夹)属性变动的方案和实现

在《libev源码解析》系列中,我们分析了libev的基本原理。本文我们介绍一套使用libev封装的文件(夹)变动监视方案和实现。(转载请指明出于breaksoftware的csdn博客) 我们先看个最简单方案,下面的代码会监视/home/work下文件(夹)的新增、删除等操作。 v...

2019-02-05 21:15:56 637 0

原创 Golang反射机制的实现分析——reflect.Type方法查找和调用

        在《Golang反射机制的实现分析——reflect.Type类型名称》一文中,我们分析了Golang获取类型基本信息的流程。本文将基于上述知识和经验,分析方法的查找和调用。(转载请指明出于breaksoftware的csdn博客) 方法 package main impo...

2019-01-08 20:19:06 2125 0

原创 Golang反射机制的实现分析——reflect.Type类型名称

        现在越来越多的java、php或者python程序员转向了Golang。其中一个比较重要的原因是,它和C/C++一样,可以编译成机器码运行,这保证了执行的效率。在上述解释型语言中,它们都支持了“反射”机制,让程序员可以很方便的构建一些动态逻辑。这是C/C++相对薄弱的环节,而Gol...

2019-01-08 20:09:44 3873 0

原创 C++拾取——Linux下实测布隆过滤器(Bloom filter)和unordered_multiset查询效率

        布隆过滤器是一种判定元素是否存在于集合中的方法。其基本原理是使用哈希方法将数据映射到一个很长的向量上。在维基百科上,它被称为“空间效率和查询时间都远远超过一般的算法”的方法。由于它只保存散列的数据,所以对于很长的数据有着良好的压缩特性,这个是个不争的事实(可以参见《布隆过滤器 (B...

2018-12-26 20:26:02 647 0

原创 Gin源码解析和例子——中间件(middleware)

        在《Gin源码解析和例子——路由》一文中,我们已经初识中间件。本文将继续探讨这个技术。(转载请指明出于breaksoftware的csdn博客)         Gin的中间件,本质是一个匿名回调函数。这和绑定到一个路径下的处理函数本质是一样的。         再以Engin...

2018-12-03 18:38:08 3001 2

原创 Gin源码解析和例子——路由

        Gin是一个基于golang的net包实现的网络框架。从github上,我们可以看到它相对于其他框架而言,具有优越的性能。本系列将从应用的角度来解析其源码。(转载请指明出于breaksoftware的csdn博客)         本文我们将分析其路由的原理。先看个例子(源于gi...

2018-11-30 23:48:42 3795 2

原创 Colly源码解析——结合例子分析底层实现

        通过《Colly源码解析——框架》分析,我们可以知道Colly执行的主要流程。本文将结合http://go-colly.org上的例子分析一些高级设置的底层实现。(转载请指明出于breaksoftware的csdn博客) 递归深度         以下例子截取于Basic ...

2018-11-28 22:04:59 1336 0

原创 Colly源码解析——框架

        Colly是一个使用golang实现的数据抓取框架,我们可以使用它快速搭建类似网络爬虫这样的应用。本文我们将剖析其源码,以探析其中奥秘。(转载请指明出于breaksoftware的csdn博客)         Collector是Colly的核心结构体,其中包含了用户对框架行为...

2018-11-27 19:08:21 1238 0

原创 并行计算——OpenMP加速矩阵相乘

        OpenMP是一套基于共享内存方式的多线程并发编程库。第一次接触它大概在半年前,也就是研究cuda编程的那段时间。OpenMP产生的线程运行于CPU上,这和cuda不同。由于GPU的cuda核心非常多,可以进行大量的并行计算,所以我们更多的谈论的是GPU并行计算(参见拙文《浅析GP...

2018-10-22 21:47:22 3360 0

原创 C++拾取——使用stl标准库实现排序算法及评测

今天看了一篇文章,讲各种语言的优势和劣势。其中一个观点:haskell非常适合写算法,因为使用者不用去关心具体的计算机实现,而只要关注于操作语义。这让它在专心研究算法的人中非常受欢迎。所以很多时候,语言的争论没有太多的意义,有意义的是它适不适合某些场景或者某些人。(转载请指明出于breaksoft...

2018-10-18 22:00:17 1267 2

原创 C++拾取——使用stl标准库生成等差、等比数列的方法

代码是思想的表达。阅读代码是一个猜测、求证的过程。这个过程非常费脑,所以人们都不喜欢啰啰嗦嗦的表达方式。于是在相同认知水平下,简洁高效的表达是喜闻乐见的。本文将抛砖引玉,通过一些案例讲解如何去简化代码。(转载请指明出于breaksoftware的csdn博客) 关系数列 等差数列 比...

2018-10-12 13:17:48 807 0

原创 C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(Windows VirtualStudio)——遍历和删除

      相关环境和说明在《C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(Windows VirtualStudio)——插入》已给出。本文将分析各个容器中遍历和查找的性能。(转载请指明出于breaksoftware的csdn博客) 遍历 从前往后 traversal_b...

2018-10-06 01:17:46 716 0

原创 C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(Windows VirtualStudio)——删除

        相关环境和说明在《C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(Windows VirtualStudio)——插入》已给出。本文将分析从头部、中间和尾部对各个容器进行删除的性能。(转载请指明出于breaksoftware的csdn博客) 删除 头部删除 元素...

2018-10-06 00:41:25 684 0

原创 C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(Windows VirtualStudio)——插入

        操作系统是Windows10 64bit,编译器是 Microsoft Virtual Studio Community 10。编译产出是64位测试程序。(转载请指明出于breaksoftware的csdn博客)         因为加入测量,就会导致误差。我已经尽量将环境影响降...

2018-10-05 23:59:58 476 0

原创 C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(ubuntu g++)——遍历和查找

        相关环境和说明在《C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(ubuntu g++)——插入》已给出。本文将分析各个容器中遍历和查找的性能。(转载请指明出于breaksoftware的csdn博客) 遍历 从前往后 元素个数&gt;15000 t...

2018-10-05 21:21:25 570 0

原创 C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(ubuntu g++)——删除

        相关环境和说明在《C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(ubuntu g++)——插入》已给出。本文将分析从头部、中间和尾部对各个容器进行删除的性能。(转载请指明出于breaksoftware的csdn博客) 删除 头部删除 元素个数&gt;1...

2018-10-05 17:06:08 482 0

原创 C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(ubuntu g++)——插入

        操作系统是ubuntu 18.04.1 server amd64,gcc是 7.3.0。编译产出是64位测试程序。(转载请指明出于breaksoftware的csdn博客)         因为加入测量,就会导致误差。我已经尽量将环境影响降低,但是还是难免有误差。大家可以通过文后...

2018-10-05 17:05:57 434 0

原创 bug诞生记——隐蔽的指针偏移计算导致的数据错乱

        C++语言为了兼容C语言,做了很多设计方面的考量。但是有些兼容设计产生了不清晰的认识。本文就将讨论一个因为认知不清晰而导致的bug。(转载请指明出于breaksoftware的csdn博客) class Base { public: Base() = default; ...

2018-09-28 21:20:42 352 0

原创 一套使用注入和Hook技术托管入口函数的方案

        工作中,我们可能会经常使用开源项目解决一些领域中的问题。这种“拿来主义”是一种“专业人干专业事”的思想,非常实用。(转载请指明出于breaksoftware的csdn博客)         一般场景下,我们都是把开源项目代码编译到我们自己的项目中。这样的“融合”,就相当于让两个项...

2018-09-28 01:59:14 913 2

原创 ffmpeg api的应用——提取视频图片

        这些年来,“短视频”吸引了无数网民的注意。相对于丰富有趣的内容,我们码农可能更关心其底层技术实现。本系列文章将结合ffmpeg,讲解几则视频处理案例。(转载请指明出于breaksoftware的csdn博客)         “短视频”都是以“文件"的形式保存于服务器上...

2018-09-20 19:34:23 1858 0

原创 bug诞生记——const_cast引发只读数据区域写违例

        对于C++这种强类型的语言,明确的类型既带来了执行的高效,又让错误的发生提前到编译期。所以像const这类体现设计者意图的关键字,可以隐性的透露给我们它描述的对象的使用边界。它是我们的朋友,我们要学会和它相处,而不是改变它。(转载请指明出于breaksoftware的csdn博客)...

2018-09-11 23:39:13 244 0

原创 bug诞生记——临时变量、栈变量导致的双杀

        这是《bug诞生记》的第一篇文章。本来想起个文艺点的名字,比如《Satan(撒旦)来了》,但是最后还是想让这系列的重心放在“bug的产生过程”和“缺失的知识点”上,于是就有了本系列这个稍微中性的名称。(转载请指明出于breaksoftware的csdn博客)         本系...

2018-09-05 01:41:00 385 1

原创 C++拾趣——使用多态减少泛型带来的代码膨胀

        泛型编程是C++语言中一种非常重要的技术,它可以让我们大大减少相似代码编写量。有时候,我和同事提及该技术时,称它是“一种让编译器帮我们写代码的技术”。(转载请指明出于breaksoftware的csdn博客)         C++是一门静态语言,它最终的编译成果是可以直接运行于...

2018-09-01 15:05:38 489 0

原创 从0开始搭建编程框架——插件

        我将插件设计为两种类型。一种是框架自身携带的插件,用于增强其基础能力。一种是用户自定义插件,用于完成业务。本文将分别介绍在peleus框架下,这两种插件该怎么写。(转载请指明出于breaksoftware的csdn博客)         本文谈下框架自身携带的插件怎么写。我们以操...

2018-08-15 16:36:33 331 0

原创 从0开始搭建编程框架——主框架和源码

        一个良好的结构是“对修改关闭,对扩展开放”的。(转载请指明出于breaksoftware的csdn博客)         这个过程就像搭建积木。框架本身需要有足够的向内扩展能力以使自身有进化能力,其次要有足够的外向扩展能力以使其可以方便定制业务。一般来说,我们让使用者继承框架暴露...

2018-08-14 16:55:22 1741 0

原创 从0开始搭建编程框架——思考

        需求来源于问题。(转载请指明出于breaksoftware的csdn博客)         之前有个人做前端开发的同学在群里问“C语言能做什么?能写网页么?”,然后大家就开始基于这个问题展开争辩。有的认为是“不能,从来没听说过C语言能写网页”;有的说“能,连浏览器都是C写的”。我...

2018-08-14 16:55:09 484 0

原创 brpc介绍、编译与使用

brpc又称为baidu-rpc,是百度开发一款“远程过程调用”网络框架。目前该项目已在github上开源——https://github.com/brpc/brpc。(转载请指明出于breaksoftware的csdn博客) 据目前公开的资料,我们发现百度内部从2010年开始,开发过若...

2018-08-10 21:10:09 22173 3

原创 数据竞争(data race)问题分析的利器——valgrind的Helgrind

        数据竞争(data race)是指在非线程安全的情况下,多线程对同一个地址空间进行写操作。一般来说,我们都会通过线程同步方法来保证数据的安全,比如采用互斥量或者读写锁。但是由于某些笔误或者设计的缺陷,还是存在data race的可能性的。(转载请指明出于breaksoftware的...

2018-08-02 23:12:59 3125 0

原创 死锁问题分析的利器——valgrind的DRD和Helgrind

        在《DllMain中不当操作导致死锁问题的分析--死锁介绍》一文中,我们介绍了死锁产生的原因。一般来说,如果我们对线程同步技术掌握不牢,或者同步方案混乱,极容易导致死锁。本文我们将介绍如何使用valgrind排查死锁问题。(转载请指明出于breaksoftware的csdn博客) ...

2018-08-02 20:09:00 1857 4

原创 互斥量、读写锁长占时分析的利器——valgrind的DRD

        在进行多线程编程时,我们可能会存在同时操作(读、写)同一份内存的可能性。为了保证数据的正确性,我们往往会使用互斥量、读写锁等同步方法。(转载请指明出于breaksoftware的csdn博客)         互斥量的用法如下 pthread_mutex_lock(&am...

2018-08-02 18:04:55 375 0

原创 动态执行流程分析和性能瓶颈分析的利器——gperftools的Cpu Profiler

        在《动态执行流程分析和性能瓶颈分析的利器——valgraind的callgrind》中,我们领略了valgrind对流程和性能瓶颈分析的强大能力。本文将介绍拥有相似能力的gperftools的Cpu Profiler。(转载请指明出于breaksoftware的csdn博客)  ...

2018-07-31 17:06:48 2410 0

原创 堆状态分析的利器——gperftools的Heap Profiler

        在《内存泄漏分析的利器——gperftools的Heap Checker》一文中,我们介绍了如何使用gperftools分析内存泄漏。本文将介绍其另一个强大的工具——Heap Profiler去分析堆的变化过程。(转载请指明出于breaksoftware的csdn博客)     ...

2018-07-30 18:50:04 2912 2

原创 内存泄漏分析的利器——gperftools的Heap Checker

        在《内存问题分析的利器——valgraind的memcheck》一文中,我们介绍了如何使用valgrind分析各种内存问题。valgrind是基于模拟器的技术实现,而本文介绍的gperftools则是通过在用户代码中嵌入检测代码实现的。(转载请指明出于breaksoftware的c...

2018-07-30 18:32:23 5020 0

原创 堆状态分析的利器——valgraind的DHAT

        在《堆问题分析的利器——valgraind的massif》一文中,我们介绍了如何使用massif查看和分析堆分配/释放的问题。但是除了申请和释放,堆空间还有其他问题,比如堆空间的使用率、使用周期等。通过分析这些问题,我们可以对程序代码进行优化以提高性能。本文介绍的工具DHAT——d...

2018-07-26 17:23:46 442 0

原创 堆问题分析的利器——valgraind的massif

        堆问题也是内存问题的一部分。如果我们发现程序内存一直在增加,怀疑是内存泄漏,则可以使用《内存问题分析的利器——valgraind的memcheck》一文中介绍的“内存泄露”方法去分析定位。当然我们还可以使用本文介绍的工具——massif。(转载请指明出于breaksoftware的...

2018-07-25 17:22:16 1837 0

提示
确定要删除当前文章?
取消 删除