c++中的false sharing(伪共享)是什么_c++多核缓存行问题与解决方案【并发】

admin 百科 12
伪共享是多线程程序中因不同线程修改同一缓存行内不同变量,触发缓存一致性协议频繁同步而导致的性能下降;需通过填充、对齐或线程局部存储等方式隔离独写变量。

c++中的false sharing(伪共享)是什么_c++多核缓存行问题与解决方案【并发】-第1张图片-佛山资讯网

False sharing(伪共享)是多线程 C++ 程序在多核 CPU 上性能下降的常见隐形杀手——它不是代码逻辑错误,而是缓存系统“太聪明”导致的意外竞争。

什么是伪共享?

现代 CPU 每个核心都有自己的 L1/L2 缓存,而缓存以 缓存行(cache line) 为单位加载数据(通常是 64 字节)。当两个线程分别修改同一缓存行中不同变量时,即使它们互不干扰,也会因缓存一致性协议(如 MESI)反复使对方缓存行失效,强制重新同步——这种无意义的缓存行争用就是伪共享。

举个例子:

struct Counter {
  int a; // 线程 1 写
  int b; // 线程 2 写
};

ab 恰好落在同一 64 字节缓存行内,两个线程高频更新就会触发频繁的缓存行无效化与重载,性能可能暴跌数倍。

立即学习“C++免费学习笔记(深入)”;

如何识别伪共享?

它不会报错,但会表现为:
• 多线程加速比远低于预期(甚至比单线程还慢)
• CPU 使用率高,但实际吞吐低
• perf 或 VTune 等工具显示大量 LLC-load-missesremote-node-loadscache-references 异常升高

标签: node 大数据 字节 工具 c++ nas 内存占用

发布评论 0条评论)

还木有评论哦,快来抢沙发吧~