SPSC 无锁环形缓冲区设计剖析: 从原理到每一行代码的工程抉择
深度剖析 liudegui/ringbuffer 的 SPSC 无锁环形缓冲区实现。逐项解析缓存行对齐、2 的幂位掩码、wait-free 无重试设计、精确 acquire-release 内存序、FakeTSO 单核模式、批量 memcpy、ProducerClear 所有权修正等 12 项设计决策,每项标注 为什么这样做 和底层硬件原理。
深度剖析 liudegui/ringbuffer 的 SPSC 无锁环形缓冲区实现。逐项解析缓存行对齐、2 的幂位掩码、wait-free 无重试设计、精确 acquire-release 内存序、FakeTSO 单核模式、批量 memcpy、ProducerClear 所有权修正等 12 项设计决策,每项标注 为什么这样做 和底层硬件原理。
共享内存是 Linux 进程间通信中延迟最低的机制,但原始的 POSIX shm_open/mmap 接口缺少同步、生命周期管理和崩溃恢复。本文从 POSIX 共享内存原理出发,剖析 newosp 框架中 ShmRingBuffer 的 CAS 无锁设计、ARM 内存序加固、缓存行对齐等工程决策,并与 cpp-ipc 库进行架构对比,展示嵌入式场景下共享内存 IPC 的完整工程方案。
本文基于一个实际的线程间消息传递需求(Windows 风格的 SendMessage/PostMessage),分析传统 mutex + priority_queue + promise/future 方案的工程缺陷,然后用 MCCC 无锁消息总线重新实现,并通过完整的测试和 Sanitizer 验证。
无锁编程的基础性原理文章。从 CAS 原子操作的硬件实现出发,严格定义 lock-free 与 wait-free 的进展保证差异,深入分析 ABA 问题及其解决方案,阐明 acquire-release 内存序的必要性,最终以 SPSC/MPSC/MPMC 三种队列模式为主线,展示无锁数据结构从设计到工程落地的完整知识体系。
系统级性能优化不是微调指令,而是在编译器、数据布局、并发架构三个层面做出正确选择。本文从编译器内建函数、编译期多态替代虚函数、零堆分配热路径、缓存友好布局、无锁并发、Active Object 去锁化架构、行为树并行启动、实时调度八个方向,结合 newosp 基础设施库的实际代码,给出可落地的嵌入式 C/C++ 优化实践。
std::shared_ptr 和 std::weak_ptr 在桌面开发中是安全的默认选择,但在嵌入式实时系统中会引入原子引用计数开销、堆碎片化、不确定延迟和竞态条件等问题。本文从一个 weak_ptr 竞态 bug 出发,系统分析智能指针在嵌入式场景的五个根本陷阱,并展示 newosp C++17 基础设施库如何用 ObjectPool、FixedFunction、ScopeGuard 和 expected 实现零堆分配的确定性内存管理。
传统设计模式依赖虚函数和动态分配,在嵌入式系统中代价过高。本文基于 newosp 库的真实代码,展示 8 种编译期设计模式的实现:类型擦除替代 std::function、ScopeGuard 替代虚析构、if constexpr 编译期分发、Tag Dispatch 构造控制、强类型包装、Pub/Sub 零堆回调、Visitor 直接分发、以及 CRTP 编译期 Handler 绑定。所有模式在 -fno-exceptions -fno-rtti 下可用,热路径零堆分配。
以激光雷达点云处理流水线为主线,展示 newosp C++17 事件驱动架构如何解决工业传感器系统的三大工程难题: 零堆分配消息传递 (CAS 无锁 MPSC + variant 值语义)、可建模的状态管理 (层次状态机 LCA + Guard)、以及微秒级确定性调度。从端到端数据流切入,逐层拆解 AsyncBus、HSM、SPSC 如何协同支撑一条完整的工业数据处理流水线。
在嵌入式 Linux 产品开发中,telnet 调试 shell 是一个常见需求:通过网络连接到设备,执行诊断命令、查看运行状态、修改配置参数。本文为 C++17 header-only 纯 POSIX 实现的过程,最终产物是 telsh 项目。
RT-Thread 的 MSH (Micro Shell) 是嵌入式领域最成功的命令行交互组件之一。本文剖析 MSH 的核心设计理念,讨论在嵌入式 Linux 上实现同等功能的三种方案 (Embedded CLI 移植、newosp shell、自研 embsh),并重点介绍 embsh 如何在一个纯头文件库中融合多后端 I/O、telnet 协议、认证、历史导航和 Tab 补全。
在嵌入式 ARM Linux 项目中,基于 Boost.Log 的日志方案因临时对象创建、std::regex 解析和动态链接依赖而成为性能瓶颈。本文以 loghelper 的重构为例,将其改造为 C++14 header-only 架构,支持 spdlog/zlog/fallback 三后端编译期切换,实现 10-100 倍性能提升。
在轻量 RTOS 项目和嵌入式Linux中,合作式任务调度器是比操作系统线程更轻量的执行抽象。
MCCC (Message-Centric Component Communication) 消息总线的完整 API 参考,涵盖 FixedString/FixedVector 容器、MessageEnvelope 消息封装、AsyncBus 总线接口、StaticComponent 编译期组件、优先级与背压配置,每个接口附带签名、参数说明和使用示例。
在同一硬件上统一测试 MCCC、eventpp、EnTT、sigslot、ZeroMQ、QP/C++ 六个消息总线方案,从吞吐量、延迟、内存安全、嵌入式适配性四个维度给出选型建议
性能基准测试远比 ‘跑个循环、算个平均’ 复杂得多。队列溢出会虚高吞吐 30%,时钟调用本身构成 60-160% 的测量开销,功能差异让 ‘apples-to-apples’ 几乎不可能。本文从实际踩坑经验出发,系统梳理消息总线与并发数据结构基准测试中的常见陷阱与应对策略。