41. 无锁数据结构与内存序:CAS、ABA 与安全内存回收
从锁的代价出发,讲透原子操作与 C++ 内存序(relaxed/acquire/release/seq_cst)的语义边界,剖析 CAS 循环与 ABA 问题的成因与 tagged pointer 解法,拆解 Treiber 栈与 Michael-Scott 队列的实现要点,最后对比引用计数、Hazard Pointer、EBR 与 RCU 四种安全内存回收方案。
tag
从锁的代价出发,讲透原子操作与 C++ 内存序(relaxed/acquire/release/seq_cst)的语义边界,剖析 CAS 循环与 ABA 问题的成因与 tagged pointer 解法,拆解 Treiber 栈与 Michael-Scott 队列的实现要点,最后对比引用计数、Hazard Pointer、EBR 与 RCU 四种安全内存回收方案。
互斥锁在高竞争下会引发上下文切换与优先级反转,无锁数据结构用 CAS 等原子原语把同步下沉到硬件层面。本文从原子原语与 CAS 循环讲起,完整实现无锁栈与 Michael-Scott 队列,剖析 ABA 问题的成因与带标记指针的解法,重点讨论无锁编程真正的难点——内存回收,对比 hazard pointer、RCU 与 epoch-based reclamation 三种方案,给出内存序选型清单与压测验证方法。
本文深入 Zig 的并发原语:std.Thread 线程模型、Mutex/Condition/RwLock 同步、std.atomic.Value 原子类型与内存序,以及消息传递模式与锁竞争优化,最后给出基准对比。
为什么需要无锁编程 在多线程程序中,互斥锁(mutex)是最常用的同步原语,但它并非银弹。当线程竞争锁失败时,操作系统会将其挂起,引发一次开销可观的上下文切换。在高度竞争的场景下,多个线程反复获取和释放同一把锁,还会导致缓存行颠簸(cache line bouncing)——锁变量所在的缓存行在各个
Redis 分布式锁实现:单实例 SET NX EX、Redlock 算法、Lua 脚本原子性、看门狗续期与生产实践
深入讲解 Go sync/atomic 包的完整使用方式,涵盖 atomic.Value、atomic.Int32、Int64 等类型化原子操作、CAS 原理、内存序、与 mutex 的性能对比基准测试、无锁计数器实现、配置热更新应用,以及 ABA 问题与使用边界。