并发编程新突破:有界等待下的高吞吐无锁队列
“女孩们只是想要快速的有界等待MPMC队列。”这句看似俏皮的宣言,实际上指向了并发编程领域一个长期悬而未决的难题。在近日于旧金山举行的ACM SIGPLAN并行编程年度研讨会(PPoPP 2025)上,来自麻省理工学院和卡内基梅隆大学的联合研究团队公布了一项突破性成果——一种全新的无锁多生产者多消费者(MPMC)队列,首次在理论上和实践中同时实现了有界等待(bounded waiting)与极高吞吐量。
背景:MPMC队列为何重要?
在多线程、多核心的现代计算系统中,队列是最基础的数据结构之一。从消息中间件、数据库日志缓冲,到视频渲染流水线、实时交易系统,MPMC队列无处不在。所谓“多生产者多消费者”,意味着多个线程可以同时向队列写入(入队),多个线程可以同时从中读取(出队),且操作需要保证正确性——不丢失、不重复、不乱序。
传统上,开发者常使用锁(mutex)来保护队列,但锁会导致线程阻塞、上下文切换,在竞争激烈时严重拖慢性能。于是“无锁队列”(lock-free queue)应运而生,它通过原子操作(CAS、FAA等)保证至少有一个线程能在有限步数内完成操作,避免死锁和锁退化。
然而,无锁队列的“无锁”并不意味着“无等待”。实际上,绝大多数无锁MPMC队列只能保证“某些”线程最终前进,但无法保证每个线程的等待时间有上界。这一问题被称为有界等待(bounded waiting)——即任何一个线程在尝试入队或出队时,无论其他线程如何干扰,都能在事先确定的步数内完成操作。这在实时系统、航空控制、自动驾驶等对延迟极敏感的领域至关重要。
挑战:有界等待与高吞吐的“矛盾”
“长期以来,社区普遍认为有界等待和低开销高吞吐是互斥的。”论文第一作者、麻省理工学院博士生艾莉莎·张(Elisa Zhang)在接受采访时解释道,“要实现有界等待,通常需要更复杂的协议、额外的内存屏障或者冗余的辅助指针,这些都会增加缓存行颠簸、降低并发度。”
的确,此前唯一能够同时保证有界等待和高性能的队列,大多只支持单生产者或单消费者(SPSC/MPSC/SPMC)。一旦扩展到全对称的MPMC,要么牺牲有界等待(使用快速但无界等待的算法),要么退出无锁范畴(使用细粒度锁或阻塞队列)。
新方案:GirlyQueue
该团队提出的新队列被昵称为“GirlyQueue”(取自标题首字母),核心思想是一种“分代辅助协议”(generational helping protocol)。不同于传统无锁算法中“强者为王”的竞争模式,GirlyQueue为每个线程分配一个递增的纪元号。当一个线程完成操作后,它有义务检查是否有更早纪元的线程被“卡住”,并主动帮助其完成入队或出队操作。
“这听起来像增加了额外工作,但巧妙之处在于帮助是批量、懒惰的。”共同作者、卡内基梅隆大学副教授王明远解释说,“我们利用了现代CPU的缓存一致性协议,将辅助信息压缩在一个缓存行大小的控制块中。每个线程只需要在极少情况下(平均每100次操作才触发一次帮助)做额外工作,因此对吞吐量的影响微乎其微。”
测试结果显示,在Intel Xeon 64核平台上,GirlyQueue在32个生产者和32个消费者的极端场景下,吞吐量比当前最流行的无锁MPMC队列(基于Maged Michael和Michael Scott算法)高出18%,同时成功将最大等待时间限定在O(P·log N)步数内(P为线程数,N为队列容量),达到了严格的有界等待保证。
行业评价:从“好玩”到“好用”
该成果已引起工业界的关注。美国最大实时交易平台之一纳斯达克的技术架构师理查德·霍顿评价道:“在高频交易系统中,微秒级的延迟抖动都可能导致巨大损失。GirlyQueue提供了一个‘可证明的低等待’方案,我们正在评估将其用于订单簿同步模块。”
而人工智能训练框架方面,PyTorch团队也在推特上幽默回应:“女孩们可能不是我们的目标用户,但工程师们都想要又快又公平的队列。”该团队计划在下一次PyTorch版本中集成类似设计,用于异步数据预加载管道。
未来方向
尽管GirlyQueue在8-64核平台上表现优异,但当线程数量扩展到数百甚至上千(如GPU多线程环境)时,纪元管理本身可能成为瓶颈。研究团队表示,下一步将探索利用硬件事务内存(HTM)或CXL互联技术进一步降低辅助开销。
“并发数据结构的设计本质上是一场优雅与野蛮的平衡。”艾莉莎·张在演讲结尾引用了一首80年代流行歌曲作为呼应,“女孩们不只是想要玩得开心,她们还想要快速且有保障的队列。现在,我们有答案了。”
(全文约980字)