打造极速 MPMC 队列:有界等待的艺术

Girls Just Wanna Have Fast MPMC Queues with Bounded Waiting

继上一篇长文后,我尝试设计一种能在多线程间高效共享缓冲区的无锁数据结构。虽然早期版本误称其为 wait-free,但经 Reddit 用户 matthieum 指正后已修正为有界等待模型。该队列基于 ticket lock 机制,利用两个 AtomicUsize 计数器和环形缓冲区,通过位运算优化索引计算,避免了昂贵的取模操作。实测表明,这种设计消除了 CAS 循环,极大降低了缓存争用。本文详细拆解了从理论设计到 Rust 代码实现的完整过程,并分享了基准测试结果,希望能与各位无锁编程爱好者交流心得。

我并非声称这种数据结构有什么突破性的创新,这仅仅是我对自己在无锁和 wait-free 编程领域直觉的一次测试。
  • 有评论者指出原帖引用的 Rust 代码存在严重的内存安全问题,因为 WFQueue 的 Sync 和 Send 实现未对泛型 T 施加约束,可能导致非原子引用计数在多线程间传递。
  • 一位从业者强调 Lock-free 和 Wait-free 是昂贵的特定属性而非通用优势,在大多数场景下 Vyukov MPMC cycle queue 等虽不满足严格无等待但性能更优的结构是更务实的选择。
  • 针对有界等待队列的设计,有观点认为无法同时实现全局 FIFO 顺序、多生产者非阻塞以及原子提交,必须根据具体需求在慢速消费者阻塞生产者或内存无界等权衡中取舍。
  • 有评论者质疑原文关于 Wait-free 的宣称,指出若任意线程挂起会导致其他线程失败,则不符合 Wait-free 定义,并建议通过填充 Cache Line 或使用双射哈希来解决 False Sharing 问题。

同日更多故事

2026-07-09