大多数'无锁'代码其实不是无锁的
拆穿高星「无锁」库:隐藏 mutex、被滥用的 memory_order_relaxed,以及 CAS 重试循环的阻塞本质;附 x86 vs ARM 差异。
Linux 内核、存储与网络、可观测性、系统架构与大模型基础设施的工程笔记:机制拆解、踩坑复盘与可核对证据,少空谈。
共 5 篇文章 · 返回首页
拆穿高星「无锁」库:隐藏 mutex、被滥用的 memory_order_relaxed,以及 CAS 重试循环的阻塞本质;附 x86 vs ARM 差异。
x86 LOCK 前缀、ARM LL/SC、ARMv8.1 LSE、RISC-V A 扩展——四种硬件原子原语的工程差异。本文讲 fetch_add/CAS/swap 成本、cache line bouncing、tearing 与内核 atomic API。
当多线程争抢一把 mutex 保护的队列时,吞吐量随线程数增长反而下降——锁成了瓶颈。无锁队列用 CAS 循环取代互斥,换来真正的无阻塞并发,但也引入了 ABA 问题和内存回收的工程深渊。
Treiber 栈可能是最简单的无锁数据结构——只需要一个 CAS 操作就能完成 push 和 pop。但'最简单'不意味着'没有坑'。从 ABA 问题到伪共享,从指数退避到 elimination backoff,这个看似朴素的数据结构蕴含了并发编程最核心的设计权衡。
正确的无锁数据结构可以写出来。但代价比你想象的大。CAS 循环、ABA 问题、内存回收、x86 和 ARM 的行为差异——这篇从一行 compare_exchange 开始,到一个完整的无锁哈希表结束。