☰
无锁队列:跨线程消息传递的实现与选型——从 SPSC 环形缓冲到 MPMC 的内存序与 ABA
2026/10/26 10:27:03 网站建设 项目流程

一、开场:一行lock_guard换来 11 毫秒

凌晨两点的性能会议。

一张火焰图打在屏幕上:音频线程的耗时 P99 是11.3ms。
而音频驱动给的交付窗口是10ms。

于是每隔几十秒,玩家耳朵里就会炸开一声"啪"。

有人指着那根刺眼的柱子问:“这里为什么这么长?”
答案是一行谁都不觉得有问题的代码:

std::lock_guard<std::mutex> lock(audioMutex); // 等主线程放手

音频线程,一个优先级最高的实时线程,被一个正在小核上打日志的主线程,锁在门外 11 毫秒。

这篇文章讲的,就是怎么让这扇门根本不存在。


二、锁到底贵在哪:不是平均慢,是尾部炸

大多数人对锁的印象是"慢"。这个印象是错的——无争用的互斥锁只要 20~50ns,比你想象中快得多。

锁真正致命的是另外三件事。

2.1 罪状一:P99 爆炸,而不是平均值变慢

无争用: 25 ns ← 99% 的情况 有争用: 1,000 ns ← 上下文切换 最坏情况:11,000,000 ns ← 持锁者被调度器切走了

<

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询