
基础组件设计专栏
文章平均质量分 76
百亿苍狗
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
3.3 开源组件
spdlog 是一款高效的 C++ 日志库,它以其。原创 2025-07-27 22:20:18 · 608 阅读 · 0 评论 -
3.2.7 手把手实现分布式锁
可用性依赖数据库;若数据库是单点,挂掉将导致业务系统不可用;还需额外实现锁失效的问题;解锁失败,其他线程将无法获得锁;可用性依赖 redis 的可用性;容错性很差,redis 采用的异步复制,数据可能丢失;效率最高的一种分布式锁;最安全的 redis 分布式锁: lock-cpp.git;原创 2025-07-25 20:06:43 · 826 阅读 · 0 评论 -
3.2.6 手写内存泄漏检测组件
1. 继续使用“宏替换”方案(#define malloc nMalloc。2. 使用“LD_PRELOAD 动态链接器劫持”方案。把宏定义放到一个公共头文件(例如 memhook.h。顶部 #include "memhook.h"也可以把它做成静态库 libmemhook.a。,然后最后链接时加上 -lmemhook。把 nMalloc/nFree。方法二:借助编译器强制包含。,也不用重新编译它们。,一起编译链接即可。原创 2025-07-25 19:29:20 · 370 阅读 · 0 评论 -
3.2.5 手写死锁检测组件
死锁,是指多个线程或者进程在运行过程中因争夺资源而造成的一种僵局,当进程或者线程。死锁的存在是因为有资源获取环的存在,所以只要能检测出资源获取环,就等同于检测出。处于这种僵持状态,若无外力作用,它们将无法再向前推进。资源获取环可以采用图来存储,使用有向图来存储。检测的原理采用另一个线程定时对图进程检测是否有环的存在。锁,从而构建了一个资源获取环。二.死锁检测实现的原理。原创 2025-07-25 18:50:34 · 338 阅读 · 0 评论 -
3.2.4 定时器方案红黑树,时间轮,最小堆
时间轮是一种高效的定时任务管理结构,通过环形数组存储任务,并通过时间指针周期性移动来触发任务。或者使用 事件队列(event queue),让时间轮线程自行处理任务添加。任务可能耗时较长,导致时间指针无法及时移动,影响任务触发的准确性。时间轮线程 只负责任务检测,将任务放入 任务队列 或 线程池 处理。影响高精度定时,多个任务需要在不同时间执行,可能造成任务堆积。高层时间轮(如分钟层)每次移动一格(触发低层重新映射)。单层时间轮:时间指针转一圈后,重新计算任务存放的位置。原创 2025-07-25 17:24:57 · 764 阅读 · 0 评论 -
3.2.3 用户态网络缓冲区设计
2. 系统调用 read/write(TCP) sendto/recvfrom(TCP/UDP) WSASend/WSARecv(Windows)定长buffer在之前网络io多路复用的reactor.c已经实现过了,以下是chainbuffer的相关代码。3. 为什么需要用户态网络缓冲区-->生产者的速度大于消费者的速度。4. 如何设计用户态网络缓冲区-->从生产消费模型得出需要实现。1. linux 接收发送数据-->read,write。以上主要介绍前四个问题 ,下面来介绍三种方案。原创 2025-07-25 16:11:41 · 296 阅读 · 0 评论 -
3.2.2 无锁消息队列实现
是原子操作的一种,可用于在多线程编程中实现不被打断的数据交换操作,从而避免多线程同时改写某一数据时由于执行顺序不确定性以及中断的不可预知性产生的数据不一致问题。该操作通过将内存中的值与指定数据进行比较,当数值一样时将内存中的数据替换为新的值。在同步机制上的争抢队列:任务将大量的时间(睡眠、等待、唤醒)浪费在获得保护队列数据的互斥锁,而不是处理队列中的数据上。动态内存分配:当一个任务从堆中分配内存时,会阻塞所有与这个任务共享地址空间的其它任务(进程中的所有线程)。告知原子性交换是否成功。原创 2025-07-25 10:42:24 · 365 阅读 · 0 评论 -
3.2 高性能组件
原子操作(AtomicOperation)是指在多线程并发编程中,作为一个不可分割的单元执行的操作。无论操作过程中是否有其他线程或进程的干扰,它都会以整体的方式执行完毕。换句话说,原子操作在执行时要么完全完成,要么完全不做,过程中不会被中断,并且中间状态也不会暴露给其他线程。原创 2025-07-19 20:19:52 · 1081 阅读 · 0 评论 -
3.1 池式组件
需要通过发送心跳维持连接,定时发送心跳维持连接(mysql_ping、mysql_pong),确认处理SQL语句的线程是活跃的。内存池的存在主要是为了适配业务需求,不同的场景需要的内存分配方式也不一样。异步连接:发起请求后继续执行之后的语句,有需要时进行callback回调。线程数量继续增加,由于系统资源的限制,不再带来性能的提升,反而带来负担。维持和管理固定数量线程的池式结构;mysql连接是tcp连接,维持的是长链接。线程池组成部分:固定数量的线程+ 队列。可异步处理生产者线程的任务;原创 2025-07-18 19:36:02 · 832 阅读 · 0 评论