自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(19)
  • 收藏
  • 关注

原创 Mac m1上使用docker搭建C++开发调试环境

因为mac上虚拟机都不太好用,有些还收费,故使用docker来搭建虚拟机。况且我的Mac是m1芯片,用的是arm架构,虚拟机更是少。

2022-08-21 21:33:27 1804

原创 C语言实现协程----初探

协程定义协程,从编程的角度看来,可以理解为用户自己能控制和调度的线程,可以理解为用户级别的线程。一个线程可以有多个协程,一个进程也可以有多个协程。协程实现协程的实现有多种方式setjmp和longjmpsigsetjmp和siglongjmpucontext函数族本次采用ucontext实现,思路是:在进行函数跳转前,将获取当前调用者的上下文,并在当前调用者的上下文的基础上进行修改,制作新的函数堆栈,然后切换到函数的上下文。当函数执行结束,切换到调用者的上下文,让调用者继续执行协程调度。

2022-04-29 17:30:01 1386

原创 Docker学习指引

目录Docker概述虚拟机技术容器化技术基本组成镜像容器仓库开始Docker安装通信模型Docker为什么比VM快Docker常用命令帮助命令镜像命令容器命令常用其他命令常见部署部署Nginx部署Tomcat部署ES + Kibana可视化工具portainerDocker镜像UnionFS联合文件系统Docker镜像加速的原理分层原理commit镜像容器数据卷概念使用数据卷数据卷容器Mac上进入容器目录Dockerfile基础指令构建自己的镜像构建Tomcat镜像Docker概述发布一个项目,能不能

2021-10-10 22:55:05 475

原创 Redis学习指引

目录Redis入门Redis-key基本数据类型StringListSetHashZset三种特殊数据类型GeospatialHyperloglogBitmap事务配置文件RDBAOFRedis发布订阅Redis主从复制原理哨兵模式Redis缓存穿透、击穿、雪崩缓存穿透缓存击穿缓存雪崩欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定

2021-09-23 23:03:30 189

原创 C++ 模仿实现Java SpringMVC框架中Controller

背景之前有很长一段时间学过Java的SpringMVC框架,被它的简洁优雅所感动。后面从事了C++开发,遇到相识的开发场景总会联想到Java的框架上,本文就分享一下如何用C++模仿实现SpringMVC中Controller的功能效果。分析与实现我们先来看看SpringMVC是怎么来写Controller的@RestControllerpublic class HelloWorldController { @RequestMapping("/hello") public Strin

2021-02-22 00:47:44 2137

原创 C++ 揭开JSON序列化的奥秘----从协议解析到普通对象JSON序列化底层原理的解析与实现

目录Ⅰ:格式解析篇一:JSON格式解析初步二:Token解析三:JsonValue的组装四、JSON解析全部代码五:测试Ⅱ:普通对象JSON序列化篇一:说明二:准备工作三:详细代码四:测试Ⅲ:总结Ⅰ:格式解析篇一:JSON格式解析初步我们都知道JSON格式是怎么样的,在这里我们不详细说明JSON的格式,如果需要查看更详细的介绍,可以去JSON中国网站查询。在这里,我们只介绍JSON格式的解析过程。那么,要解析JSON格式,我们到底需要怎么做呢?本文主要分两步:找有效字符:抽出JSON字符串中的

2021-02-19 22:00:58 1116 2

原创 [C++]记一次由placement new引发内存泄露的惨痛教训

背景由于项目中用到一个类,那个类的构造方式有点麻烦,而且它的构造函数有很多个,每一个构造函数都或多或少与其他的构造函数有点相似,只是少了一些参数而已,于是想到可以在另一个构造函数中,利用placement new在this指针的地方来构造,本来想着因为它是在对象本身的地址的地方,不会有内存泄漏出现,但是问题还是出现了。placement newnew操作符相信我们大家都很熟悉,在此就不介绍了,而placement new相信大家用得都比较少。一般来说,我们new出来的对象一般都是放在进程内存划分中的自

2021-02-04 13:05:15 1262 2

原创 C++使用有限状态自动机编程解析HTTP协议

目录Http请求报文格式简介请求方法协议请求头解析HTTP协议的有限状态自动机编码运行测试小结Http请求报文格式简介对于Http请求报文,想必大家都不陌生。Http请求报文主要由4部分组成,分别为请求行、请求头、空行、请求体。请求报文格式如下图所示:请求方法请求方法包括GET、HEAD、PUT、POST、TRACE、OPTIONS、DELETE等,详见官方文档。协议协议版本的格式为:HTTP/主版本号.次版本号,常用的有HTTP/1.0和HTTP/1.1。请求头请求头为一系列键值对形式

2021-01-07 17:14:14 1912

原创 Linux下基于信号和共享内存实现进程池

目录介绍实现测试介绍为了实现进程池,我们主要需要考虑以下几个点1:如何进行进程间通信2:进程间如何共享数据关于进程间通信,有很多种方式,比如说管道,信号,socket,共享内存,消息队列等,本文主要基于信号和共享内存来实现进程间通信。对应linux的函数原型为:int kill(pid_t pid, int sig); //发送信号int sigaction(int signum, const struct sigaction *act, struct sigaction *oldac

2020-12-03 11:51:22 135

原创 分布式事务的分析与解决方案的总结

目录什么是事务什么是分布式事务最终一致性分布式事务详解分布式事务解决方案TCC与XA/JTA对比什么是事务事务由单独单元的一个或者多个SQL语句组成,在这个单元中,每个语句相互依赖,而整个单元作为一个不可分割的整体。如果单元中某条SQL语句执行失败或者产生错误,整个单元就会回滚,所有受影响的数据将会返回到事务开始以前的状态。如果单元中所有的SQL都执行成功,则事务被顺利执行。原子性一个事务不可再分割,要么都执行,要么都不执行一致性一个事务的执行会使数据从一个一致状态切换到另一个一致的状态隔离

2020-06-14 14:53:48 202

原创 google序列化协议protobuf底层源码分析

目录序列化/反序列化序列化协议需要考虑什么Java自带的序列化类Protobuf序列化Protobuf特性Protobuf核心代码解析序列化/反序列化序列化将对象序列化为二进制数据【字节数组】,一般也将序列化成为编码,主要用于网络传输、数据持久化反序列化将从网络上、磁盘等读取的字节数组还原为原始的对象,一般也将反序列化成为解码,主要用于网络传输对象的解码,一边完成远程调用序列化协议需要考虑什么序列化之后码流大的大小【占用网络带宽】字节长度,这就是金钱序列化与反序列化的性能【cpu资源的

2020-06-13 19:25:53 605

原创 ES6新特性学习与分析

【ES6新特性】1:let2:const3:解构表达式4:字符串拓展5:函数优化6:对象优化7:数组新增方法8:Promise异步编排9:模块化

2020-06-05 00:36:35 144

原创 C++11 mysql数据库从原生api的封装到ORM库的实现 [高仿通用mapper接口]

目录一:mysql原生api的封装和连接池的实现二:ORM的实现1:封装初衷2:封装思路3:测试结果三:总结四:代码仓库1:github2:码云一:mysql原生api的封装和连接池的实现ORM封装的第一步,需要对mysql原生api进行封装,让之后的调用更加便捷。同时,为了能复用连接,提高获取连接的效率,还做了个连接池。具体封装和实现可查看c++ mysql数据库操作api接口的封装c++ 基于mysql原生api数据库连接池的实现二:ORM的实现1:封装初衷做过Java web服务器开

2020-05-23 15:49:05 1931

原创 C++11 设计模式--模板方法模拟实现Java Spring AOP

目录一:背景二:具体实现三:应用一:背景当进行数据库更新的时候,有以下场景需要处理:1:业务方法执行开始的时候,需要拿到数据库连接,然后开启事务。2:若业务在某个环节抛异常,为了数据库数据的而一致性,需要回滚事务。3:若业务执行无异常,需要提交事务。4:最后无论业务成功或者失败,都需要释放资源。对于这个业务场景,Java Spring框架的AOP可以很方便的对业务方法做拦截处理。Java动态代理也能很方便的实现该需求。而C++没有相对应的特性。本文模仿Java AOP,基于设计模式中的模板方法,

2020-05-13 14:41:30 639 2

原创 C++ SQL语句构建器的实现[与mybatis3使用方式一致]

目录一:简介二:实现三:使用示例一:简介1:有时候我们需要动态生成SQL语句,我们当然可以在代码中直接写出那条SQL语句,然而令人头疼的是对于SQL语句的各种换行,格式化,逗号,AND和OR的处理,都是很容易出错的,对此,需要有一个更加智能的方式方便我们编写SQL语句。2:MyBatis提供了一个好用的工具类帮助我们解决这个问题,其文档地址为:Mybatis SQL 语句构建器本文仿造Mybatis,模仿实现了一个基于C++语言版的SQL语句构建器。二:实现首先需要一个拼接SQL语句的类S

2020-05-10 15:49:40 1353 1

原创 wsl环境下搭建QT12.6开发环境[QT无界面命令行安装]

unbuntu下qt12.6命令行安装

2020-05-09 21:09:03 1092 1

原创 C++ 基于mysql原生api数据库连接池的实现

目录一:思路二:实现三:后续一:思路1:连接池中至少保存有最小连接数的数据库连接。当连接数达到最大值的时候,无法再创建新的连接,如果需要获取一个连接,则需要等待相对应的时间。2:连接池中数据库连接接口基于上篇文章封装的Connection的实现,主要是实现对mysql原生api的封装。文章链接:c++ mysql数据库操作api接口的封装二:实现首先连接池是单例的,所以封装下单例模式。Singleton.hpp/** * 单例模式的封装类 * @tparam T */templ

2020-05-09 12:06:25 627

原创 C++ mysql数据库操作api接口的封装

目录一:关键接口说明二:具体实现三:接口测试四:后续一:关键接口说明一般预处理流程都是,连接数据库–>预处理–>绑定查询参数–>执行查询–>获取查询结果。故api封装之后有如下几个关键的接口:1:bool connect(); //连接数据库,初始化数据库连接等2:bool prepare(const std::string &query);//预处理3:template<typename T> void bindValue(int pos, cons

2020-05-06 12:25:13 3495 1

原创 C++线程池的简单实现 [Java风格]

目录1:简介2:C++版本的BlockingQueue3:C++版本的Runnable接口3:ThreadPoolExecutor4:测试代码1:简介本文基于C++11,实现的线程池功能实现相当于java中核心数线程为size,最大线程数为size,任务队列为无界队列的ThreadPoolExecutor线程池,且简化了,直接一次性生产出size数量的线程。凡是继承了Runnable接口的任务都可以提交到该线程池中。任务队列也模仿Java的BlockingQueue阻塞队列。2:C++版本的Block

2020-04-16 00:07:55 464

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

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