自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 MIT6.5840 lab3A

const (CandidateLeadermu sync.Mutex // 加锁以保护对该节点状态的共享访问peers []*labrpc.ClientEnd // RPC端点persister *tester.Persister // 用于保存此节点已持久化状态的对象me int // 此节点在 peers 数组中的索引dead int32 // 由 Kill() 函数设置// 持久性状态currentTerm int // 记录当前的任期votedFor int // 投给了谁。

2025-03-23 15:49:51 241

原创 sylar:日志管理

宏是由 预处理器 在编译之前展开的,它通过文本替换来处理代码。宏通常使用 #define 来定义。性能:宏在编译前直接替换代码,因此 没有函数调用的开销。这在某些性能关键的代码中非常有用,比如需要大量重复计算的常量表达式。灵活性:宏可以接受任意复杂的参数,并通过字符串化 (#) 或拼接 (##) 来动态生成代码。调试困难:宏没有类型检查,它们在预处理阶段展开,调试时你无法看到宏展开后的结果。如果宏中存在错误,编译器可能会提示不明确的错误信息。

2024-12-16 12:54:06 1166 1

原创 sylar高性能服务器框架:CMakeLists.txt文件解析

force_redefine_file_macro_for_sources(targetname) 这个 CMake 函数的主要目的是 重定义源文件中的 _ _ FILE _ _ 宏,使其包含相对于项目根目录的文件路径,而不是默认的绝对路径。是 CMake 中用来创建一个共享库(Shared Library)的命令,具体来说,它创建了一个名为 sylar 的共享库,并将源文件列表 LIB_SRC 中列出的文件编译成这个库。:是之前定义的 CMake 变量,代表最终需要编译成库的源文件列表。

2024-12-16 12:53:20 682

原创 Golang项目:实现生产者消费者模式

因为,如果我们没有先关闭控制channel,那么消费者和生产者就都还没有收到停止的消息,在两行语句的时间差中,会发生很多写入channel的操作。多对多模式,消费者和生产者都不主动退出,我们通过一个第三方信号来控制退出。同时创建one-one.go文件,来实现单生产者单消费者模型。如果先关闭数据channel,在关闭控制channel。Chanel的线程安全的,所以可以直接执行并发操作。报错,说我们往关闭了的channel里写数据。所以我们要先关闭控制channel。这时候我们关闭channel。

2024-11-26 17:00:40 630

原创 Golang项目:实现一个内存缓存系统

unsafe.Sizeof 来获取一个接口值(interface{})的大小时,它实际上返回的是接口结构体本身的大小,而不是接口中存储的具体值的大小。现在的问题是,我们只是设置了,在过期之后,就不能访问了,但是实际上还占用着缓存,只有在再一次Get的时候,发现过期了,才会删除掉。使得我们的Set方法的time部分参数为可选择填写0-n个参数,但我们只使用第一个expire[0]作为我们使用的参数。我们在cache目录中,新建一个单元测试,memCache_test.go。如:get,add,del操作。

2024-11-24 16:28:39 551

原创 golang开源框架:命令行框架cobra

四个钩子函数执行顺序:PreRun --》Run --》接下来,我们来看继承import ("fmt"fmt.Println("钩子案例,run函数")},//run函数之前执行},//run函数之后执行},// run之前},//run之后},fmt.Println("钩子案例,run函数")},//run函数之后执行},//run之后},可以看到,我们没有写PersistentPreRun()和PostRun。

2024-11-19 17:20:48 790

原创 golang开源框架:go开源验证框架validator

当我们从map进入dive之后,就会发现有两个值key和value,可以先验证key再验证value。gte=5,lte=10,number ---- 是大于等于5小于等于10的数字。如果表示字符串,而是直接是数字,那么number和numeric就没有区别。对于数字类型的字符串,需要用numeric来校验(它可以校验小数点)中第一个满足了第一维度有3个,但是第二维度大于5个则都不满足。可以验证slice的长度,至于内容,看本文第三节。可以看到,第三个报错,OpCode只能是1或者2。

2024-11-18 21:53:10 651

原创 Golang云原生项目:—实现ping操作

记住,运行时需要以管理员身份,才能解析socket。测试显示,可以成功拿到命令行的参数。定义ICMP报文格式。

2024-11-17 20:04:44 391

原创 GOLANG笔记第四周

原本的本地函数放到另一个服务器上运行,但是引入了很多新问题Call 的id映射序列化和反序列化网络传输。

2024-11-15 13:09:48 1111

原创 go debug日记:protoc -I . helloworld.proto --go_out=plugins=grpc:.错误debug

用来生成与 gRPC 相关的代码(例如 gRPC 服务的客户端和服务器代码)。path 表示生成的go文件的存放地址,会自动生成目录的。用来生成常规的 Go 代码(例如消息的 Go 结构体)。插件中,gRPC 相关的 Go 代码不再通过 –运行成功,生成helloworld.pb.go文件。即,没有指定生成的go文件位置,需要在文件中添加。使用protoc生成go的文件出现bug。name 表示生成的go文件所属的包名。

2024-11-14 12:18:47 384

原创 c++进阶(3)

提问:如果程序发生了不正常运行,比如在if语句内直接return了,那么就没有unlock操作,锁就直接废了。存在竞态条件:多线程程序执行的结果是一致的,不会随着cpu对线程不同的调度顺序,而产生不同的运行结果。t.detach():把t线程设置为分离线程,主线程结束,整个进程结束,所有子线程都自动结束了!std::thread定义一个线程对象,传入线程所需要的线程函数和参数。线程间的互斥=》mutex=》用lock_guard封装mutex。互斥锁是比较重的,如果临界区代码做的事情稍微的复杂,多。

2024-11-01 10:02:33 833

原创 c++进阶(2)

一:关键字和语法auto:可以根据右值,推到出右值的类型,然后左边变量的类型也就已知了。nullptr:指针专用,能和整数进行区别}//底层就是通过指针或迭代器来实现的右值引用:move移动语义函数和forward类型完美转发函数。模板的一个新特性:typename…A 表示可变参(类型参数)二:绑定器和函数对象bind绑定器function对象lambda表达式三:智能指针shared_ptr和weak_ptr四:容器unordered_set和unordered_map;

2024-10-31 10:05:07 1209

原创 c++进阶(1)

原则一: 函数参数传递过程中,对象优先按引用传递,不要按值传递。可以省一个形参的构造和析构原则二:函数返回对象的时候,应该优先返回一个临时对象,而不要返回定义过的对象直接构造,不产生临时对象其次,我们虽然省去了在函数方法中创建临时对象,即从:函数方法中创建的对象=》main栈帧中创建临时对象用于传递=》传递给t2变成了:直接main栈帧中创建临时对象=》传递给t2但是其实还可以优化直接用构造方法构造t2int main()Test t1;

2024-10-28 10:56:33 959

原创 手写数据库连接池---C++11(下)

通过返回智能指针来控制连接的释放,当连接出作用域的时候,智能指针自动调用析构函数,此时只要修改析构函数,让他把资源归还给连接池,而不是删除就可以。当队头元素超时时,陆续释放超时资源,直到没有,或者已经到连接池初始大小。如果连接池空了,生产者就检查,此时连接数量是否超过了设置的最大连接数。---- ---- 如果在最大空闲时间内获取,检查到非空,则跳出循环。---- ---- 如果超时,获取连接失败,返回nullptr。在main函数中实现,添加1000条数据库数据,记录时间。

2024-10-26 13:37:33 1103

原创 手写数据库连接池---C++11(上)

连接池事先会和MySQL Server创建initSize个数的connection连接。当应用发起MySQL访问时,不用再创建和MySQL Server新的连接,直接从连接池中获取一个可用的连接就可以。使用完成后,并不去释放connection,而是把当前connection再归还到连接池当中。当并发访问MySQL Server的请求增多时,初始连接量已经不够使用了,此时会根据新的请求数量去创建更多的连接给应用去使用。

2024-10-24 22:03:00 1314

原创 施磊c++基础8

C++STL : standard template libaray底层数据结构:动态开辟的数组。每次以空间大的二倍扩容增加vec.push_back(20); 末尾添加元素20 — O(1)vec.insert(it,20);在it迭代器指向的位置插入元素20 — O(n)删除vec.pop_back; 末尾删除元素 ---- O(1)vec.erase(it) ;删除it迭代器指向的位置的元素 — O(n)查询operator[ ]使用vec[ i ]访问第i个位置元素 — O(1)iter

2024-10-22 16:52:20 1068

原创 施磊c++基础7

注意:此时需要在D中加入A的构造,即使从继承类看,他并没有直接继承A。但是由于B,C都是虚继承,此时A的构造就要定位到D中对A进行构造;由于内存结构*p指向的是派生类基类部分数据的起始地址D8,但是vbptr和mb都还在前面,这时候delete p;这两句是一样的,只不过使用第二种,可以保证类型转换是安全的,如果要转换成不符合的类型就会报错。基类指针指向派生类对象,永远指向的是派生类基类部分数据的起始地址。对于第一种,int转char,编译器认为是安全的,就可以通过。d的内存布局 ---- 占20字节。

2024-10-19 13:30:29 489

原创 施磊c++基础6

当new Base()的时候,Base()的构造函数调用了clear(),把new的Base对象的内容全部归零了,包括vfptr,而在运行的时候,找不到vftable了,就出错了。如果派生类中的方法,和基类继承来的方法,返回值,函数名,参数列表都相同,而基类的方法是虚函数,那么这个派生类的方法,自动处理成虚函数。一个类里面定义了虚函数,那么这个类定义的对象,其运行时,内存中开始的部分,多存储一个vfptr虚函数指针,指向相应类型的虚函数表vftable。底层是通过动态绑定来实现的。

2024-10-18 22:18:19 795

原创 施磊c++基础5

示例代码1 — 删除容器中的偶数i < 20;++i)for (;it!报错了!!!为什么?//第一次调用erase以后,迭代器it就失效了//那么再进行++就报错示例代码2 — 给vec容器中所有的偶数添加一个小于偶数值1的数字for (;it!也会报错在遇到第一个偶数的时候,是把第一个偶数及其以后的迭代器全部失效所以到底为什么会失效?

2024-10-15 16:40:04 813

原创 施磊c++基础4

当使用pop()的时候,仅仅是_last–了,原来Test指向的内存并没有析构掉,当创建新对象时,原来的内存就丢掉了。,那么他就会强转为int类型,并且抛出一个警告,说明在T类型转换时可能会发生数据丢失。这使得我们可以只用一套代码实现一套逻辑,至于具体的实例化,交给编译器就行了。可以根据用户传入的实参类型,来推导出模板类型参数的具体类型。其实,在STL中,有很多的对于字符串类型的特例化版本。,a与b是同一类型,此时编译器无法判断,就会报错。模板函数,模板的特例化,非模板函数的重载关系。

2024-10-13 21:04:02 381

原创 施磊c++基础3

那么就会出错,原因是,在创建一个CGoods类时,由于在构造函数中并没有指明_date要如何构造,使用会使用Cdate的默认构造函数,但在Cdate中,我们重写了他的构造函数,那么他就不会提供默认的构造函数了。上图的浅拷贝中,s2仅仅是复制了一份s1对象的内容的一个新对象,但他们里面指针指向的仍然是同一块内存,当s1析构之后,这块内存就被释放,此时s2析构时去释放一块不存在的内存,就会出错。即,类的成员方法一经编译,所有的方法参数,都会加一个this指针,接收调用该方法的对象的地址。

2024-10-12 19:42:09 836

原创 施磊c++基础2

所以在C++中第一个结果和第三个结果都是被常量初始化替换了,就是初始化的10,而实际上a的值也已经被*p给修改了。inline内联函数,在编译过程中就没有函数调用的开销了,在函数调用点直接把函数的代码进行展开处理。答2:实际上就是作用域的问题,只有在同一个作用域内的相同函数名直接使用不同的参数列表才能进行重载。什么是函数重载:从函数调用来看,是处在同一作用域内的同名但不同参数列表的一组函数。由于c++和c生产符号的规则不一样,所以在编译的时候,无法进行对应(找不到)。

2024-10-11 10:09:41 719

原创 施磊c++基础1

从main函数进入sum时,会把当前的栈的起始地址(main函数的ebp)压入sum函数栈的栈底,当函数结束后弹出,此时就知道main函数在哪里了。sum函数最后会存之前进入sum函数的指令的下一条指令地址放到PC寄存器。问题1:main 函数调用sum,sum执行完以后,怎么知道回到哪个函数?问题2:sum函数执行完,回到main以后,怎么知道从哪一行指令继续运行?将*.cpp文件(源文件)=》*.o文件(二进制可重定位目标文件)链接过程:编译完成的所有.o文件+静态库文件=》所有.o文件段的合并。

2024-10-08 14:12:32 328

原创 GOLANG笔记第三周

随便写写的学习笔记

2024-09-26 20:19:45 524

原创 1.3.1 智能指针

为什么要使用智能指针。

2024-08-12 19:24:50 1050

原创 1.2.2 设计模式(二)

提供一个接口,让该接口负责创建一系列“相关或相互依赖的对象”,无需指定他们具体的类稳定点:创建同类对象接口 对象创建接口变化点:同类对象有多个相同的职责 功能接口。

2024-08-09 16:52:57 262

原创 1.2.1设计模式(一)

例子:某气象站发布气象资料给数据中心,数据中心经过处理,将气象站的信息更新到两个不同的终端( A和B);例子:某品牌动物园,有一套固定的表演流程,但是其中若干个表演可以创新替换,以尝试迭代更新表演流程。对象间的一对多依赖关系,当一个对象改变状态时,所有依赖于它的对象都会得到通知并自动更新。例子:某商场节假日有固定的促销活动,为了加大促销力度,现提升国庆节促销活动规格;比喻:整洁的房间,好动的猫,怎么保证房间的整洁?稳定点:一对多的依赖关系,“一”变化的时候“多”跟着变化。

2024-08-08 12:23:35 749

原创 1.1.2 Hash与BloomFilter

上一节介绍了平衡二叉树中的和B\B+树(草稿丢了不补了)。平衡二叉树的主要思想:通过比较的方式保证有序,通过每次排除一半元素的方式达到快速索引的目的。增删改查时间复杂度为:O(logn)

2024-08-07 19:10:12 427 1

原创 Redis缓存雪崩、穿透、击穿

案例:假设访问淘宝流程。

2024-08-07 11:54:44 350

原创 1.1.1红黑树

左旋代码实现(将左旋中,x和y互换,left和right互换)5.从任意节点到其每个叶子的所有路径都包含相同的黑色节点。关键存在于 [key,value] 结构,强调查找。4.每个红色节点的两个子节点都是黑色的。3.Nginx Timer事件管理。1.epoll事件管理怎么做的。2.Linux进程调度CFS。3.每个叶子的节点都是黑色。课后作业:了解红黑树的应用。1.节点是红色或者黑色。1)key的类型写死了。

2024-08-07 06:39:18 435

空空如也

空空如也

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

TA关注的人

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