C26 Hazard Pointers 详解无锁数据结构的内存回收本文是「C26 新特性单篇精讲」系列第 19 篇。阅读约需 7 分钟文末可跳转完整合订本。一、是什么Hazard Pointers 是一种无锁数据结构的安全内存回收机制。读线程显式声明「我正在使用这个指针」写线程延迟删除直到确认没有读线程引用它。C26 通过hazard_pointer头文件提供标准 Hazard Pointer 原语。二、为什么需要它无锁链表中一个节点被删除时可能还有其他线程正在读取。Hazard Pointers 提供了一种低开销的方式来保护这些「濒危」节点不被真正释放。三、完整代码示例#includehazard_pointer#includeatomic#includememorystructNode{intvalue;std::atomicNode*next{nullptr};};std::atomicNode*head{nullptr};intfind(inttarget){std::hazard_pointer hpstd::make_hazard_pointer();Node*currhead.load(std::memory_order::acquire);while(curr){hp.protect(curr);// 声明我正在使用 curr// 重新读取确认 curr 仍然有效Node*checkhead.load(std::memory_order::acquire);if(check!curr){currcheck;continue;}if(curr-valuetarget){returncurr-value;}currcurr-next.load(std::memory_order::acquire);}return-1;}voidretire_node(Node*node){// 标记为待回收Hazard Pointer 系统会在安全时释放std::rcu_retire(node);}四、编译器支持与特性测试宏编译器状态GCC尚未完整实现Clang尚未完整实现MSVC尚未完整实现#if__cpp_lib_hazard_pointer202411L#includehazard_pointer#endif五、常见陷阱保护后必须重新检查指针防止在保护前节点已被删除Hazard Pointer 数量有限通常与线程数相关大量并发节点可能阻塞回收通常与 RCU 或垃圾回收结合使用。六、小结Hazard Pointers 是无锁编程的安全网。C26 标准化后手写无锁链表、队列、哈希表时可以不再重复造轮子。返回 C26 新特性全景合订本 C26 新特性全景解析C/C 后台架构学习社区欢迎关注https://github.com/0voice本文基于 C26 已批准特性撰写具体实现以编译器文档为准。