c++什么是伪共享 c++多核CPU缓存问题详解【并发】

admin 百科 18
伪共享是多核CPU中因变量同处一缓存行引发的无效缓存同步现象;缓存行通常64字节,线程写入任一变量即导致整行失效并触发MESI协议开销,需通过perf工具识别并用alignas或padding隔离变量。

c++什么是伪共享 c++多核CPU缓存问题详解【并发】-第1张图片-佛山资讯网

伪共享(False Sharing)是多核 CPU 上因缓存行对齐不当导致的性能陷阱:多个线程修改不同变量,却因它们落在同一缓存行而频繁触发缓存同步,白白消耗带宽和时间。

缓存行与伪共享怎么发生的

CPU 缓存不是按字节管理,而是以固定大小的“缓存行”(Cache Line)为单位加载数据,常见大小为 64 字节。当两个变量物理地址落在同一缓存行内,即使被不同线程独占访问,只要任一线程写入,整个缓存行就会被标记为“已修改”。其他核上该行副本随即失效——下次读取必须重新从内存或其它核同步,引发不必要的缓存一致性协议开销(如 MESI 状态切换)。

例如:

  • 结构体中两个 bool 成员紧挨着定义:struct { bool a; bool b; };
  • 线程 A 修改 a,线程 B 同时修改 b
  • ab 落在同一 64 字节缓存行,两者会互相“干扰”,性能可能下降数倍

如何识别伪共享

不能靠肉眼判断,需结合工具和模式分析:

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

标签: linux 字节 工具 c++ nas 热点 red

发布评论 0条评论)

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