自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Qt::QOpenGLWidget 渲染天空壳

Qt::QOpenGLWidget 渲染天空壳

2023-02-28 16:22:56 969

原创 红黑树hashmap-RbtHashMap实现

基于红黑树的固定长度的hashmap实现,对c++标准库map的进一步优化

2022-05-22 13:39:41 441

原创 Qt::QOpenGLWidget渲染带光照的立方体

Qt::QOpenGLWidget调用opengl渲染框架渲染立方体加光照

2022-03-06 13:18:28 924

原创 内存的申请和释放

内存的申请和释放,malloc,free干了什么,delete[]和delete的区别

2021-12-25 19:27:48 2314

原创 过家家巧说raft算法

一 一致性 一致性是指分布式系统中的多个服务节点,给定一系列操作,在特定协议的保障下,使这些节点对外呈现的状态是一致的,即保证集群中所有服务节点中的数据完全相同并且能够对某个提案达成一致,为什么需要一致性?1 数据不能存在单个节点(主机)上,否则可能出现单点故障。2 多个节点(主机)需要保证具有相同的数据。3 一致性算法就是为了解决上面两个问题。二 Raft算法 Raft是实现分布式共识的一种算法,主要用来管理日志复制的一致性。它和Paxos的功能是一样,但是相比于Pax...

2021-11-14 11:56:14 4295

原创 固定长度hashmap实现

固定长度的hashmap代码实现

2021-09-21 17:16:01 1080

原创 lua和c++交互

交互原理Lua教程:绑定一个简单的C++类(6)Lua教程:C/C++操作Lua数组和字符串(5)Lua教程:Lua调用C/C++函数(4)Lua教程:C/C++调用Lua的Table(3)Lua教程:C++和Lua相互传递数据(2)Lua教程: C++嵌入Lua脚本(1)

2021-07-24 15:46:07 1154

转载 TiDB 数据库开发规范

原文链接:https://asktug.com/t/topic/93819一、前言1. 目的 本文档旨在为使用 TiDB 数据库的应用和系统提供统一规范参考,标准化 TiDB 数据库的开发使用及SQL优化流程,提高业务开发系统的规范性和代码的可读性,减轻维护工作量,提高工作效率。2. 适用范围TiDB 数据库开发设计人员 数据库管理人员 数据库运营人员 数据分析人员 数据库架构师4. 注意事项TiDB 暂时不支持的特性:存储过程 触发器 自定义函数 外键约束..

2021-06-27 14:07:16 1389

原创 检测指针被意外写坏

如何检测指针被意外写坏

2021-02-28 13:53:23 341 2

原创 opengl学前知识

opengl基础知识扫盲

2021-01-30 21:32:00 528 1

原创 opengl开发环境搭建

一 安装cmake cmake是一个跨平台的c/c++项目管理工具,下面我们编译安装相关依赖库的时候需要用到。下载页,下载后安装即可。二 安装GLFW 在我们画出出色的效果之前,首先要做的就是创建一个OpenGL上下文(Context)和一个用于显示的窗口。然而,这些操作在每个系统上都是不一样的,OpenGL有目的地将这些操作抽象(Abstract)出去。这意味着我们不得不自己处理创建窗口,定义OpenGL上下文以及处理用户输入。幸运的是,有一些库已经提供了我们所需的功...

2021-01-10 14:49:23 2086 1

原创 初识OpenGL

一 认识GPU GPU全称是GraphicProcessing Unit--图形处理器,其最大的作用就是进行各种绘制计算机图形所需的运算,包括顶点设置、光影、像素操作等。GPU实际上是一组图形函数的集合,而这些函数有硬件实现,只要用于3D游戏中物体移动时的坐标转换及光源处理。在很久以前,这些工作都是由CPU配合特定软件进行的,后来随着图像的复杂程度越来越高,单纯由CPU进行这项工作对于CPU的负荷远远超出了CPU的正常性能范围,这个时候就需要一个在图形处理过程中担当重任的角色,GPU也就是从那...

2021-01-01 17:16:45 384

原创 libgo源码分析之多线程协程管理和调度

上篇文章libco协程切换原理详解中分析了协程的切换原理,并且也说到了建议用libgo代替libco,因为libgo的协程切换原理是从boost中分离出来的,其实现原理和libco基本上是一样的,不再分析,这里我们主要分析一下libgo多线程协程的管理和调度,因为这一部分libco是没有实现的。首先我们看一段多线程示例。/************************************************ * libgo sample1********************...

2020-12-05 20:50:59 1105

原创 libco协程切换原理详解

一 备用知识 之前不止一次的把libco的源码下下来看,但是每次看到协程切换汇编部分都放弃了,大学那点仅有的汇编基础也忘的一干二净,更不堪的是百度搜到的libco相关文章也看不懂,最近决定静下心来看一些相关的东西,终于像啃骨头一样把这块东西搞明白了。在网下阅读之前请先务必看懂下面的内容。第一部分 汇编基础 1 CSAPP阅读笔记-汇编语言初探(数据传送类指令):CSAPP阅读笔记-汇编语言初探(数据传送类指令) 2 CSAPP阅读笔记-汇编语言初探(算术和逻辑操作类指令)...

2020-11-14 01:04:30 1847 2

原创 Go 语言设计与实现

第一部分 预备知识第一章 准备工作1.1 调试 Go 语言第二章 编译原理目录第一部分 预备知识第一章 准备工作1.1 调试 Go 语言第二章 编译原理2.1 概述2.2 词法和语法分析2.3 类型检查2.4 中间代码生成2.5 机器码生成2.1 概述2.2 词法和语法分析2.3 类型检查2.4 中间代码生成2.5 机器码生成...

2020-11-07 15:27:52 3597

原创 mutex如何保证数据的一致性和正确性

一 mutex如何保证数据的一致性和正确性 最近突然关于mutex有一个疑问,当我们在开发多线程程序的时候第一个想到的就是用mutex来保护我们的多线程共享变量,保证数据的一致性和正确性,那mutex到底是如何保证的呢? 1 原子访问:避免线程在访问数据对象时,另一线程正在修改它 2 内存可见性:一旦线程修改数据对象,其它线程在修改行为发生之后马上能看见此对象的最新新状态 对于第一点是我之前一直熟知的mutex具有的功能,对于第二点虽然之前了解过关于内存可见性相关的知识但是没...

2020-11-07 11:33:04 794

原创 从零开始搭建tidb集群

参考文章:TiDB-Ansible 部署方案 很早就想亲手搭一下tidb集群,昨天搞了一下午结果失败了(因为自己买的机器配置太低,还有自己配置环境的时候有些配置没配好),今天把之前的机器删掉又重新申请机器按照文档把所有的步骤重新走了一遍,总算成功了。一 准备机器 首先看一下官方的配置要求:TiDB 软件和硬件环境建议配置 , 官方配置要求很高(当然价格也很高,没钱啊),而...

2020-08-12 17:29:11 11904 3

原创 分析libevent 内部运行流程

Libevent 是一个用C语言编写的、轻量级的开源高性能事件通知库,主要有以下几个亮点:事件驱动( event-driven),高性能;轻量级,专注于网络,不如 ACE 那么臃肿庞大;源代码相当精炼、易读;跨平台,支持 Windows、 Linux、 *BSD 和 Mac Os;支持多种 I/O 多路复用技术, epoll、 poll、 dev/poll、 select 和 kqueue 等;支持 I/O,定时器和信号等事件;注册事件优先级。 实际上Libevent只是对epol...

2020-07-12 18:36:41 575

原创 c++反射实现方案的选择

由于c++原生不支持反射,绝大多数情况也不需要反射,但是有些时候如果通过反射会避免大量的重复无用的代码。

2020-06-14 17:19:20 1666 2

原创 TiDB 优化方案和常见问题

一 关于tidb的排序 1. 按照字节序的顺序扫描的效率是比较高的; 2. 连续的行大概率会存储在同一台机器的邻近位置,每次批量的读取和写入的效率会高; 3. 索引是有序的(主键也是一种索引),一行的每一列的索引都会占用一个 KV Pair,比如,某个表除了主键有 3 个索引,那么在这个表中插入一行,对应在底层存储就是 4 个 KV Pairs的写入:数据行以及 3 个索引行; 4. 一行的数据都是存在一个 KV Pair 中,不会被切分,这点和类 BigTable...

2020-05-24 12:57:33 3509

原创 dynamic_cast背着你偷偷做了什么

c++常用的四中转换类型我们都很清楚,分别是下面四中 1const_cast const_cast<目标类型>(标识符):目标类型只能是指针或者引用2static_cast类似C风格的强制转换,进行无条件转换,静态类型转换:1)基类和子类之间的转换:其中子类指针转换为父类指针是安全的,但父类指针转换为子类指针是不安全的(基类和子类之间的动态类型转换建议用dynamic_cast)。2)基本数据类型转换,enum,struct,int,char,float等。static_cast

2020-05-10 13:11:09 839

原创 c++后台开发知识点收藏

收藏一些后台开发相关的知识点1 linux系统 https://blog.csdn.net/ThinkWon/article/details/1045886792mysql数据库https://thinkwon.blog.csdn.net/article/details/1047786213 redis数据库https://thinkwon.blog.csdn.net/art...

2020-04-10 15:51:48 335 2

原创 c++ 空基类优化

我们知道c++中一个空类的大小为1个字节,那么如果一个空类作为基类或者成员对象的时候会怎样呢,是不是还是一定占用1个字节呢? c++中为保证同一类型的不同对象地址始终有别,要求任何对象或成员子对象,即使该类型是空的类类型(即没有非静态数据成员的 class 或 struct)也是如此。然而,基类子对象不受这种制约,而且可以完全从对象布局中被优化掉,若空基类之一亦为首个非静态数据成...

2020-03-25 21:15:56 552

原创 unreal 虚幻引擎学习资料

一 入门资料1 最重要的学习途径,官方文档,这个一定要看 :unreal 官方文档中文版2 游戏蛮牛相关资料的整理 :游戏蛮牛 - 手册 - 虚幻引擎4 | UnrealEngine4二 深入了解虚幻底层原理1 因为c++自身是没有垃圾回收的,所有虚幻4自己实现了一套垃圾回收机制 :虚幻4垃圾回收剖析 2 同样c++自身也没有类似于java,go等语言的反射系统...

2020-03-21 23:05:46 2318

原创 基于skiplist实现高效的排行算法(redis zset)

  首先什么是skiplist,在往下看之前先看一下下面几篇文章吧  我之前写的一篇关于skipList的文章    深入理解skiplist 了解skiplist后我们说道排行榜,排行榜实际上就是一种排序算法,常见的排序算法就是二叉树系列,红黑树,最小堆,最大堆等等,虽然他们可以提供排序功能,它们要找到一个值也很快,但是要想知道这个值排名第几,似乎只能按照先序遍历的方式来...

2020-01-12 22:26:28 1239 2

原创 记一个被自己忽略的知识点(指针本身的长度到底由什么决定)

通常我们计算指针的长度会用到sizeof(void*),我一直片面的任务指针的大小和int类型的大小是一样的,但是在一次core dump崩溃调试的过程中看到一个指针的长度竟然是64位的就以为指针是个野指针,但是最后发现问题不在那里,指针是正确的,这我才进一步的了解了指针大小到底是由系统什么因素决定的。 首先我们说下数据总线和地址总线 1)地址总线 地址总线决...

2019-12-30 11:39:29 621

原创 用ECS架构完美实现帧同步

很早之前写过一篇关于网络游戏同步方案的文章:网络游戏网络同步方案的选择,里面谈到帧同步,这里就谈一下帧同步的一种实现方式吧,主要还是以收集资料为主。 首先说一下帧同步最简单的一种实现,很简单就是服务器对客户端上行的所有指令不做任何计算直接转发给所有相关的客户端,客户端在自己本地根据服务器转发的指令做计算展现游戏数据和画面,只要所有的客户端的计算逻辑是一样的就不会出现大家看...

2019-11-17 16:36:42 3577

原创 MySQL InnoDB索引原理详解

1 简介 索引(Index)是帮助MySQL高效获取数据的数据结构。我们知道,数据库查询是数据库的最主要功能之一。但每种查找算法都只能应用于特定的数据结构之上,例如二分查找要求被检索数据有序,而二叉树查找只能应用于二叉查找树上,但是数据本身的组织结构不可能完全满足各种数据结构(例如,理论上不可能同时将两列都按顺序进行组织),所以,在数据之外,数据库系统还维护着满足特定...

2019-10-20 18:10:09 377

原创 重载new和delete来检测内存泄漏导致placement new操作符不能使用解决办法

为了检测内存泄露,重载new和delete来检测内存泄漏结果导致placement new操作符不能使用。 void *operator new(size_t size, const char *file, unsigned int line) { void *ptr = malloc(size); printf("Call new in [%s]:%d allocate %...

2019-10-07 14:03:20 357

原创 单线程读单线程写一个变量是否一定要加锁

  单线程读单线程写一个变量是否需要加锁,刚毕业的时候我会有这样的想法:一个线程只读并没有改变变量的值并不会有两个线程同时写一个变量产生竞态,所以不用加锁,但是工作中长者给我指导都是多线程必须加锁,所以我也没有深究这个问题,从来没有想过为什么。  过了一段时间后,了解到原子性这个概念,了解到虽然一个线程读一个线程写,但是因为对一个线程的写和读并非是原子的,读线程可能读到另外一个线程写到一半的值...

2019-08-25 21:50:21 8579 3

原创 15分钟了解TiDB

由于目前的项目把mysql换成了TiDb,所以特意来了解下tidb。其实也不能说换,由于tidb和mysql几乎完全兼容,所以我们的程序没有任何改动就完成了数据库从mysql到TiDb的转换。 一 TiDb简介 TiDB 是 PingCAP 公司受 Google Spanner / F1 论文启发而设计的开源分布式 HTAP (Hybrid Transactional and ...

2019-07-13 22:21:49 131685 18

原创 关于智能指针的一个疑问

c++中最大的问题就是内存管理问题也就是指针,当一个指针在程序中到处传的时候,经常会出现多次销毁,或者用到一个已经被释放的指针(野指针),特别是在多线程中这种情况更加难以处理,根本不知道什么时候会在哪个线程中被释放,虽然c++11中的智能指针有效的解决了这个问题,在很大程度上简化了内存管理的难度,但是使用不当还是会导致程序崩溃,比如你在使用的时候把一个智能指针reset或者把nullpt...

2019-06-22 13:07:09 1164

原创 redis 的持久化机制

之前去面试,问到redis的持久化问题,虽然知道一点但是有一些细节还不是很清楚,随意这里记录下有关redis 的持久化的问题,redis跟memcached类似,都是内存数据库,不过redis支持数据持久化,也就是说redis可以将内存中的数据同步到磁盘来持久化,以确保redis 的数据安全。一 什么是持久化 什么是持久化?简单来讲就是将数据放到断电后数据不会丢失的设备中...

2019-05-19 14:15:12 274

原创 认识分布式系统etcd

一 etcd的作用 etcd是一个高可用的键值存储系统,主要用于共享配置和服务发现。etcd是由CoreOS开发并维护的,灵感来自于 ZooKeeper 和 Doozer,它使用Go语言编写,并通过Raft一致性算法处理日志复制以保证强一致性。Raft是一个来自Stanford的新的一致性算法,适用于分布式系统的日志复制,Raft通过选举的方式来实现一致性,在Raft中,任何一个节点都...

2019-04-21 21:51:57 2165

原创 C++内存模型和原子类型操作

摘自 《C++并发编程(中文版) 》第5章 C++内存模型和原子类型操作 推荐阅读(强烈推荐):https://zh.cppreference.com/w/cpp/atomic/memory_order 这里从两方面来讲内存模型: 一方面是基本结构, 这个结构奠定了与内存相关的基础; 另一方面就是并发。 基本结构对于并发也是很重要的, 特别是当你阅读到底层原子操作的时...

2019-03-10 14:02:24 881

原创 进程间对共享内存同步的三种方式

    如果我们有多个进程访问一块共享内存,有时候我们为了保证数据的一致我们不得不对共享内存中的数据采取同步措施。对于共享内存的同步基本上有以下三种方式。   一 记录锁(文件锁)      我们首先来看记录锁,记录锁的功能是当一个进程正在读或者修改文件的某一个部分时,它可以阻止其他进程修改同一文件区。它其实是“字节范围锁”,因为它锁定的是文件中的一个区域,当然,也可能是整个文件。  ...

2019-02-24 18:26:10 9151

原创 揭开内存屏障的面纱

推荐阅读(强烈推荐)c++标准库内存屏障的使用一 什么是内存屏障 内存屏障(英语:Memory barrier),也称内存栅栏,内存栅障,屏障指令等,是一类同步屏障指令,是CPU或编译器在对内存随机访问的操作中的一个同步点,使得此点之前的所有读写操作都执行后才可以开始执行此点之后的操作。 每个CPU都会有自己的缓存(有的甚至L1,L2,L3),缓存的目的就是为了提高性...

2019-01-30 19:16:37 2701

原创 c++ 线程局部变量thread_local

c++11 中添加了新的关键字thread_local,用来声明新的存储期(线程存储期变量),即线程局部变量。 存储类指定符是名称声明语法的 decl-specifier-seq 的一部分。与名称的作用域一同,它们控制名称的二个独立属性:其“存储期”与其“链接”。auto - 自动存储期(C++11 起)。register - 自动存储期。亦提示编译器将此对象置于处理器的寄存器。C...

2019-01-20 17:25:38 9474

原创 linux spin_lock(自旋锁)semaphore(信号量)和mutex(互斥锁)的区别

1 spin_lock       自旋锁的实现是为了保护一段短小的临界区操作代码,保证这个临界区的操作是原子的,从而避免并发的竞争冒险。在Linux内核中,自旋锁通常用于包含内核数据结构的操作,你可以看到在许多内核数据结构中都嵌入有spinlock,这些大部分就是用于保证它自身被操作的原子性,在操作这样的结构体时都经历这样的过程:上锁-操作-解锁。      如果内核控制路径发现自旋锁“...

2019-01-13 22:03:32 3373

原创 关于smart pointers(智能指针)你必须知道的事

1  shared_ptr禁止了隐式转换(explict),不能把一个指针赋值给shared_ptr. 例:shared_ptr&lt;string&gt; pNico = new string("nico");2 make_shared初始化shared_ptr要比调用shared_ptr构造函数更快更安全,:shared_ptr&lt;string&gt; pJutta = make_sh...

2018-12-16 19:05:29 498

空空如也

空空如也

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

TA关注的人

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