- 博客(138)
- 收藏
- 关注
原创 YAML 详解
YAML 是一种适合人类阅读和维护的数据序列化格式,常用于配置文件。它使用缩进表达层级关系,语法比 XML 简洁,比 JSON 更适合人工编辑,比 INI 更适合表达复杂嵌套结构。在 C++ 工程中,使用 YAML 的核心目的不是“换一种文件格式”,而是把可变数据从 C++ 代码中拆出来,让配置和业务逻辑解耦。修改 YAML 配置值,通常不需要重新编译 C++ 程序。修改 C++ 解析逻辑或业务逻辑,才需要重新编译。如果程序只在启动时读取 YAML,那么修改 YAML 后通常需要重启程序。
2026-07-08 15:00:20
198
原创 C++ 字符串动态创建对象 -- 工厂模式、自动注册、模板递归动态调用
在游戏服务器或游戏引擎框架中,经常会遇到这样一个问题:对象并不总是由业务代码直接new出来,而是可能来自配置、网络协议、脚本、GM 命令,甚至是跨线程消息。这段代码本身没有语法问题,但在框架设计上存在明显局限。Account如果是一个由框架管理的Entity或Component,它的创建、生命周期、线程归属、注册关系、消息绑定,都不应该散落在业务代码里。。
2026-07-07 14:40:11
188
原创 ECS 存储模型:Map、Sparse Set、Archetype
ECS 存储模型不是简单地把 Component 放进容器。Entity 如何找到数据?System 如何批量找到符合条件的数据?数据如何布局才能让 CPU 更高效地访问?Map 存储简单直接,适合原型和小规模对象,但哈希查找和内存分散让它不适合作为高性能 Tick 的最终方案。Sparse Set 是非常实用的中间方案。它让单组件数据连续存储,支持 O(1) 添加、删除、查询,工程复杂度适中,特别适合中小型 ECS 和游戏服务器逻辑 ECS。Archetype + Chunk 是高性能批处理方案。
2026-07-03 00:51:47
352
原创 交换型数据结构与刷新型数据结构
与此同时,场景中的对象也在不断变化:玩家进入场景,怪物死亡,技能生成子弹,Buff 到期销毁,AOI 观察者列表发生变化。如果某个消息处理逻辑比较重,例如涉及技能校验、背包检查、场景广播、数据库异步请求派发,那么网络线程在这段时间内无法继续写入消息。在游戏服务器、实时仿真系统、网络框架中,很多问题表面上看是“用什么容器”的问题,实际是“数据在什么时候被修改、由谁修改、修改时是否安全”的问题。区别在于,渲染双缓冲通常解决的是画面撕裂和显示一致性问题,而交换型消息队列解决的是跨线程数据转移和锁粒度问题。
2026-06-28 15:01:55
342
原创 C++ 内存模型与无锁编程:从底层原理到实战
我们先看一段看起来"完全没问题"的代码:这段代码的意图非常清晰:生产者先写 ,再设 ;消费者等到 后读取 。逻辑上,输出应该永远是 42。但实际上,这段代码有三个致命问题:问题一:编译器重排序(Compiler Reordering)编译器为了优化性能,可能会调换 和 的执行顺序。因为从单线程的视角看,这两条语句之间没有依赖关系,交换顺序不影响单线程的正确性。但对于多线程,顺序至关重要。** 编译器为什么要重排序?**指令流水线:最朴素的 CPU 执行方式是:一条指令彻底完成,再开始下一条。但一条
2026-05-05 22:21:58
584
原创 深入理解Treiber Stack无锁栈
栈是最简单的数据结构之一:后进先出,push往顶部插入元素,pop从顶部移除元素。单线程下,它的实现几乎没有难度。多个线程可能同时push;多个线程可能同时pop;push和pop可能交错执行;一个线程刚读到栈顶节点,另一个线程可能已经把这个节点弹出;被弹出的节点什么时候可以delete,不是一个普通内存管理问题,而是并发正确性问题;CAS 成功只代表某个原子变量被成功修改,不代表整个链表语义一定正确。CAS 循环;release-acquire 发布关系;ABA;
2026-05-05 19:00:15
383
原创 MPMC 无锁队列从原理到实现:bounded sequence ring 和 Michael–Scott
先看全景图:如果只看“有没有多个线程”,SPSC、MPSC、MPMC 看起来只是线程数不同;但从算法结构上看,MPMC 的难度其实发生了质变。MPMC 比前两者难,不只是因为“多了几个 CAS”,而是因为你必须同时解决下面几件事:一句话概括:很多工程文章会把“没有 / ”直接叫作“无锁”。这种说法在日常交流里能用,但如果你要真正学懂并发数据结构,最好把术语边界分清楚,如以下progress guarantee:本文主线是最经典、最实用的工程方案:它有几个非常实际的优点:但同样要提前说清楚:很多人第一次写
2026-04-25 17:59:54
459
1
原创 深入理解 MPSC 无锁队列:从原理到三种实现
位置使用的内存序为什么relaxed新节点还没发布给任何其他线程,单线程可见即可acq_relrelease部分:发布新节点 n 的初始化;acquire部分:拿到 prev 时能看到上游生产者对 prev 的所有 release 写release发布 n 给 consumer —— consumer 用 acquire 加载tail->next就能看到 n 的完整内容acquire与上面的 release 配对,建立跨线程 happens-beforeacquire。
2026-04-22 00:03:58
491
1
原创 从零实现 SPSC 无锁队列
现代 CPU 的缓存以cache line(典型 64 字节)为最小单位。当两个核心分别频繁修改同一条 cache line 上的不同变量时,会触发缓存一致性协议(MESI 等)不断在核心间传递这条 line 的所有权,即使它们操作的是不同的变量。这就是伪共享。对于上面的代码:实测下来,伪共享能让性能下降 5–10 倍。这通常是无锁队列最大的性能瓶颈,比内存序还关键。环形缓冲区 + 2 的幂容量,用位与代替取模;生产者和消费者的索引分别放在独立 cache line,消除伪共享;
2026-04-16 23:59:48
602
4
原创 C++ 模板与泛型编程
假设你要写一个函数来比较两个值的大小:逻辑完全相同,只是类型不同。这就是代码重复,违反了 DRY(Don’t Repeat Yourself)原则。模板的核心目的就是:让编译器帮你根据类型自动生成代码。关键概念:非类型模板参数模板参数不一定是类型,也可以是值(必须是编译期常量):应用:固定大小的环形缓冲区、编译期确定的消息 ID 范围。1.4 模板的默认参数1.5 成员函数模板类的成员函数也可以是模板,独立于类模板参数:关键理解:模板不是函数或类本身,而是编译器生成函数或类的蓝图。只有在
2026-04-04 16:14:39
473
1
原创 Gtest
Google Test(简称 gtest)是 Google 开源的 C++ 测试框架。它被广泛应用于工业级 C++ 项目中,包括 Chromium、LLVM、OpenCV 等知名项目。所有断言都支持用<<<< "当输入为 n=" << n << " 时结果不符预期";这在循环中调用断言时特别有用,能帮你快速定位是哪次迭代出了问题。死亡测试用于验证程序在特定条件下是否会按预期终止(比如触发assert、调用abort()、或exit()这在测试错误处理逻辑时非常有用。
2026-03-24 18:12:24
448
原创 Actor模型:从原理到实战,搞懂无锁高并发
Actor模型的本质是一种架构级别的并发抽象用消息传递取代共享内存,从根本上消除数据竞争用Mailbox实现异步解耦,让系统具备弹性用监督树实现自动容错,让系统具备自愈能力用位置透明实现分布式扩展,让系统具备伸缩性它不是银弹,但在正确的场景下,它能让你的并发代码从噩梦变成工程。
2026-03-19 18:00:19
552
原创 深入理解分布式系统:从 CAP 定理到 BASE 理论
本文深入剖析分布式系统的核心理论CAP定理与BASE理论。CAP定理指出分布式系统无法同时满足一致性、可用性和分区容错性,必须权衡选择CP或AP系统。BASE理论则提供工程实践方案,通过基本可用、软状态和最终一致性来平衡CAP约束。文章还澄清常见误解,并介绍PACELC模型作为CAP的补充,帮助开发者理解分布式系统的本质与设计原则。
2026-03-18 11:31:18
400
原创 Linux -- 进程信号
本文介绍了Linux信号机制及其应用。信号是一种进程间异步通知的软中断方式,用于处理诸如Ctrl+C(SIGINT)、硬件异常等情况。文章详细讲解了信号的生命周期(产生、保存、处理),包括通过键盘输入、kill命令、系统调用(kill/raise/abort)等多种信号产生方式。重点阐述了signal和sigaction系统调用的使用方法及区别,以及信号集操作函数(sigprocmask/sigpending等)对信号屏蔽的控制机制。此外,还分析了内核态与用户态切换机制、可重入函数、volatile关键字、
2025-06-07 18:16:05
1167
2
原创 Linux -- 进程间通信(IPC)-- 进程间通信、管道、system V 共享内存、system V 消息队列、责任链模式 、system V 信号量、建造者模式、IPC资源管理
进程间通信、管道、system V 共享内存、system V 消息队列、责任链模式 、system V 信号量、建造者模式、IPC资源管理
2025-03-25 23:33:37
1454
3
原创 Linux -- 磁盘结构、文件系统ext2
磁盘的物理结构和逻辑结构、CHS寻址、LBA寻址、文件系统ext2、块、分区、inode、目录与文件名、路径解析、路径缓存、挂载分区
2025-03-06 18:06:59
1250
原创 Linux--进程(进程概念、PCB、进程状态、孤儿进程、进程优先级、进程切换、进程调度)
进程是操作系统中的一个核心概念,指的是正在执行的程序实例。它不仅包含程序的代码,还涉及程序运行时的状态和资源。程序静态的指令集合;比如:通过语言编写的程序。进程:程序的一次动态执行,包括代码、数据和状态(将磁盘的代码加载到内存中,运行的程序称之为进程 )。进程 = 内核数据结构(例如:PCB) + 程序的代码和数据执行完就退出 -- 例如:ls,pwd等指令一直不退,直到用户退出 -- 常驻进程(例如:杀毒软件)
2025-02-19 01:03:36
1412
原创 冯·诺依曼体系结构和初步认识Linux操作系统
任何计算机系统都包含一个基本的程序集合,称为操作系统(OS),是管理计算机硬件与软件资源的系统软件,充当用户与硬件之间的桥梁。内核(进程管理、内存管理、文件管理、驱动管理)其他程序(如:函数库、shell程序等)
2025-02-17 21:27:36
1155
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅