xenium 回收接口三大核心概念详解:marked_ptr、concurrent_ptr 与 guard_ptr 入门指南

📅 发布时间:2026/8/24 10:07:00
xenium 回收接口三大核心概念详解:marked_ptr、concurrent_ptr 与 guard_ptr 入门指南
xenium 回收接口三大核心概念详解marked_ptr、concurrent_ptr 与 guard_ptr 入门指南【免费下载链接】xeniumA C library providing various concurrent data structures and reclamation schemes.项目地址: https://gitcode.com/gh_mirrors/xe/xeniumxenium是一个 C 头文件库提供多种无锁并发数据结构和内存回收memory reclamation算法。本文带你快速理解 xenium 回收接口的三大核心概念marked_ptr、concurrent_ptr与guard_ptr帮助新手建立完整的知识框架轻松上手这套内存回收接口。为什么需要内存回收先搞懂 reclamation在多线程无锁数据结构中一个线程移除节点时其他线程可能正持有该节点指针。如果立刻delete就会出现悬空指针use-after-free。内存回收reclamation要解决的就是这个问题节点何时可以被安全释放xenium 内置了多种经典回收方案源码位于 xenium/reclamation/ 目录⏱️ 基于纪元epoch-basedepoch_based、new_epoch_based、debra️ 危险指针hazard_pointer、hazard_eras 无锁引用计数lock_free_ref_count 其他quiescent_state_based、stamp_it无论哪种方案xenium 都用统一的抽象接口来描述这就是今天要讲的三剑客。三剑客总览一张表看懂三大核心概念概念一句话理解类比marked_ptr能借几个位来存标记的普通指针带备注的便签concurrent_ptr原子化的 marked_ptr支持无锁 CAS原子便签guard_ptr持有即保护防止对象被回收std::shared_ptr 关键记忆点只有guard_ptr真正保护对象不被删除。concurrent_ptr本质是弱指针即使指向的内存已释放它也不会告诉你——这和std::weak_ptr/std::shared_ptr的区分非常相似。marked_ptr在指针里藏标记位的小技巧很多无锁算法如 Michael 队列需要用指针的低位存一个标记比如表示该节点已被逻辑删除。marked_ptr就干这件事模板参数MarkBits指定借用的位数最多 32 位多数系统指针实际只用 48 位所以标记优先藏在最高 16 位由XENIUM_MAX_UPPER_MARK_BITS控制mark()取出标记get()返回剥离标记后的干净指针核心文件xenium/marked_ptr.hppmarked_ptrnode, 1 p{new node, 1}; // 1 位标记 auto* raw p.get(); // 普通指针 auto m p.mark(); // 取回标记concurrent_ptr原子化的 marked_ptr无锁读写的关键concurrent_ptr就是一个支持原子操作的 marked_ptr接口与std::atomic兼容load、store、compare_exchange_weak/strong一应俱全。接口定义xenium/reclamation/detail/concurrent_ptr.hpp它内部定义了两个别名类型concurrent_ptrT::marked_ptr和concurrent_ptrT::guard_ptr供具体回收方案实现使用⚠️ 注意官方注释load()只是原子读取并不会保护目标对象免于被回收。想要保护必须升级为guard_ptr。guard_ptr守护对象不被提前回收的安全护盾guard_ptr是三者中权重最重的概念持有即保护只要guard_ptr存活它指向的对象就不会被回收acquire 获取guard.acquire(cp)原子地拍快照concurrent_ptr并建立保护概念上类似std::weak_ptr::lock()acquire_if_equal对无等待wait-free算法更友好值不匹配就提前放弃reset 释放g.reset()解除保护析构时自动调用reclaim 回收g.reclaim()将节点标记为待删除并放入回收链表等安全时机再真正释放回收链表实现见 xenium/reclamation/detail/retire_list.hpp接口定义xenium/reclamation/detail/guard_ptr.hpp以 hazard pointer 方案为例其acquire会重试直到危险指针锁定成功见 xenium/reclamation/impl/hazard_pointer.hpp。 坑点提醒guard_ptr不能跨线程移动move 语义假设源和目标同属一个线程复制构造/赋值则可以。三者如何协作一段最小使用流程完整的类型说明与示例在官方文档 doc/reclamation.md 中流程可以概括为四步节点类型继承enable_concurrent_ptr告诉回收方案该对象要参与回收把新节点store进concurrent_ptr读方用guard_ptr::acquire安全获取快照处理完成后调用reclaim()交给回收器reset()解除保护想更省事xenium 提供了辅助函数一行代码拿到 guardauto guard xenium::acquire_guard(cp); // 见 xenium/acquire_guard.hpp新手常犯错误避坑清单误以为load()就是安全引用—— 它只是弱指针必须 acquire 成guard_ptr忘记调用reclaim()—— 节点只会被移入回收链表不会自动释放跨线程 move 一个guard_ptr—— 属于未定义行为请改用复制忘记让节点继承enable_concurrent_ptr——concurrent_ptr要求目标类型带该基类忽略 mark bits 对齐要求—— 标记位需要对象对齐基类会帮你强制对齐配套测试用例适合对照学习test/marked_ptr_test.cpp、test/concurrent_ptr_test.cpp快速开始获取 xenium 并阅读源码xenium 是纯头文件库只需 C17 编译器无需额外依赖。获取仓库git clone https://gitcode.com/gh_mirrors/xe/xenium然后把xenium/目录加入头文件搜索路径即可使用。推荐按marked_ptr.hpp → concurrent_ptr.hpp → guard_ptr.hpp的顺序阅读再挑一个回收方案如hazard_pointer看具体实现。总结marked_ptr借指针位存标记是无锁算法的地基concurrent_ptr原子化 兼容std::atomic是数据结构的骨架guard_ptr唯一的安全护盾acquire获取、reset释放、reclaim回收掌握这三个概念你就读懂了 xenium 内存回收接口的设计精髓——其余七种回收方案都只是给guard_ptr穿上不同的保护衣。【免费下载链接】xeniumA C library providing various concurrent data structures and reclamation schemes.项目地址: https://gitcode.com/gh_mirrors/xe/xenium创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考