基础组件专栏
文章平均质量分 95
路飞H
这个作者很懒,什么都没留下…
展开
-
libevent实战的那些坑
libevent,libev,libuv都是c实现的异步事件库,注册异步事件,检测异步事件,根据事件的触发先后顺序,调用相对应回调函数处理事件。网络 io 事件、定时事件以及信号事件。这三个事件驱动着服务器的运行。网络io事件:mac:kqueue定时事件:红黑树最小堆:二叉树、四叉树跳表时间轮信号事件libevent 和 libev 主要封装了异步事件库与操作系统的交互简单的事件管理接口,让用户无需关注平台检测处理事件的机制的差异,只需关注事件的具体处理。原创 2023-10-08 13:53:49 · 194 阅读 · 0 评论 -
muduo高性能异步日志库的实现
如何实现高性能的日志批量写入:攒够数据,一次写入,glog / muduo唤醒机制:通知唤醒notify+ 超时唤醒锁的粒度:刷新磁盘时,日志接口不会阻塞。这是通过双队列实现的,前台队列实现日志接口,后台队列实现刷新磁盘。内存分配:移动语义,避免深拷贝;双缓冲,前台后台都设有。原创 2023-10-06 21:06:44 · 105 阅读 · 0 评论 -
手把手实现分布式锁
1、关于redis中容错性的问题:redis集群中无论是哨兵模式还是cluster集群模式,主从节点之间都是采用异步复制的方式,数据可能丢失,即锁可能丢失,这里我们采用redlock去解决,使用5个redis节点,每一个节点都是主节点,在加锁的时候保证半数以上的节点都加锁成功才进行返回。if (!i < slen;i++) {n++;原创 2023-09-24 18:46:18 · 55 阅读 · 0 评论 -
锁、避免死锁等相关
二师兄:当进程A持有锁1请求锁2,进程B持有锁2请求锁1时,两者都不会释放自己的锁,两者都需要对方的锁,就会造成死锁。二师兄:在C++中,锁(Lock)是一种同步工具,用于保护共享资源,防止多个线程同时访问,从而避免数据竞争和不一致。二师兄:在C++11之前,C++便准层面并没有定义锁,锁的应用要依赖于平台。1.避免循环等待,如果需要在业务中获取不同的锁,保证所有业务按照相同的顺序获取锁。二师兄:从种类上分,可以分为普通锁、读写锁、递归锁等种类。2.使用超时锁,当锁超时时,自动释放锁。原创 2023-09-23 14:38:17 · 33 阅读 · 0 评论 -
手写死锁检测组件
组件如何放到项目里?删除Debug部分,在项目中添加下面两句代码即可使用死锁检测组件。原创 2023-09-23 14:06:03 · 85 阅读 · 0 评论 -
环形数组无锁队列的原理与实现
在 上一篇文章中,我们已经知道了ypipe可以实现一线程写一线程读的无锁队列,那么其劣势就很明显了,无法适应多写多读的场景,因为其在读的时候没有对r指针加锁,在写的时候没有对w指针加锁。那么如何实现一个多读多写的线程安全的无锁队列呢?互斥锁:mutexqueue(太简单不介绍了)互斥锁+条件变量:blockqueue(太简单不介绍了)内存屏障:lockfreequeue(SimpleLockFreeQueue.h 暂时未写文章介绍)原创 2023-09-20 21:48:51 · 167 阅读 · 0 评论 -
zeromq无锁队列的原理与实现
yqueue_t是消息队列,用来存储节点元素,ypipe是用来控制读写位置的,里面涉及到cas操作。首先我们来看 yqueue 的设计。public://⾮原⼦操作//原⼦操作,设置⼀个新的值,然后返回旧的值//原⼦操作private:set函数,把私有成员ptr指针设置成参数ptr_的值,不是⼀个原⼦操作,需要使⽤者确保执⾏set过程没有其他线程使⽤ptr的值。xchg函数,把私有成员ptr指针设置成参数val_的值,并返回ptr设置之前的值。原⼦操作,线程安全。原创 2023-09-19 22:39:46 · 156 阅读 · 0 评论 -
CPU的亲和性
CPU领域中最广为人知的一条定律——摩尔定律:预计18个月会将芯片的性能提高一倍。过去几十年,各大公司致力于提高CPU晶体管密度和提高CPU工作频率,使得CPU的性能提升基本符合摩尔定律。但随着工艺不断发展,晶体管密度提升已经接近物理极限,CPU工作频率也由于功耗和发热的制约而无法继续提升。在基础物理领域没有大的突破的前提下,单核CPU的性能提升日益困难,于是,各大公司将目光投向了通过增加CPU核心数提高性能领域,双核、4核、8核、16核等一系列多核CPU相继问世。原创 2023-09-17 12:34:39 · 495 阅读 · 0 评论 -
锁与原子操作CAS
临界资源就是被多个线程/进程共享,但在某一时刻只能被一个线程/进程所使用的资源。下文以一个经典案例(多线程同时进行i++)介绍三种锁,以及cpu指令集支持的原子操作和CAS。主线程启动后创建十个线程,并将主线程中的count变量当作参数传入子线程中,也就是说十个线程同时操作一个共享资源count,子线程执行10w次count++ 操作,主线程每隔两秒打印一次count的值。下面来看看加锁与不加锁的区别。有两个特殊的api,尝试加锁,如果没有获取到锁则返回,而不是休眠。原创 2023-09-17 12:00:38 · 59 阅读 · 0 评论 -
纯C手写内存池
由于本文是一个连接一个内存池,所以后续介绍和代码都是以4k为分界线,大于4k的我们认为是大块内存;小于4k的我们认为是小块内存。并且注意这里的4k,并不是严格遵照4096,而是在描述上,用4k比较好描述。在真正使用内存之前,内存池提前分配一定数量且大小相等的内存块以作备用,当真正被用户调用api分配内存的时候,直接从内存块中获取内存(指小块内存),当内存块不够用了,再有内存池取申请新的内存块。而如果是需要大块内存,则内存池直接申请大块内存再返回给用户。原创 2023-09-16 18:46:08 · 50 阅读 · 0 评论 -
mysql连接池的设计与实现
数据库连接池是程序启动时建立足够数量的数据库连接,并将这些连接统一管理起来组成一个连接池,程序动态的从池中取连接与归还连接。创建数据库连接相对来说是比较耗时的,不仅有三次握手,还有mysql的三次认证过程。所以在程序启动时就创建多个连接统一管理,可以提高程序的响应性能。原创 2023-09-13 22:48:22 · 155 阅读 · 0 评论 -
定时器方案之红黑树、最小堆、时间轮
⼼跳检测技能冷却武器冷却倒计时CSDN文章的定时发布其它需要使⽤定时机制的功能int i,j;for (i=0;i原创 2023-09-05 23:06:16 · 138 阅读 · 0 评论 -
异步请求池
异步请求的方式其实适用于http、mysql、redis、dns等请求。原创 2023-08-24 23:43:37 · 50 阅读 · 0 评论 -
高效的网络传输协议设计protobuf
通信协议设计核⼼1. 解析效率2. 可扩展可升级协议设计细节1. 帧完整性判断2. 序列化和反序列化3. 协议升级4. 协议安全5. 数据压缩设计⽬标1.解析效率:互联⽹业务具有⾼并发的特点,解析效率决定了使⽤协议的CPU成本;编码⻓度:信息编码出来的⻓度,编码⻓度决定了使⽤协议的⽹络带宽及存储成本;2.易于实现:互联⽹业务需要⼀个轻量级的协议,⽽不是⼤⽽全的;原创 2023-06-04 12:54:57 · 758 阅读 · 0 评论 -
手写内存泄漏检测组件
内存泄漏检测组件常用的内存泄露检测工具有valgrind和mtrace。我们使用这两个工具的时候一般是已经发现了内存泄漏的现象了再去检测,那么有没有一种方法在内存使用的时候,就发现内存泄漏呢。在我们第一版代码实现中,更多的是想像读者介绍一些函数。而且我们用hook的时候还遇到了递归的问题,以及__builtin_return_address的VMA的问题,对于后面这个函数,我们使用系统提供的三个宏即可解决。现在我们想一下,这个hook用在这里真的合适吗?原创 2023-05-30 13:02:47 · 121 阅读 · 0 评论