加载中...

伪共享(False Sharing)指多线程程序中,两个或多个线程频繁写入恰好位于同一个缓存行(通常 64 字节)内的不同变量:虽然逻辑上互不相关,但缓存一致性协议(如 MESI)以整行为粒度工作,任一核心的写入都会使其他核心中该行失效,导致缓存行在核心间反复「乒乓」,性能可能下降一个数量级。
典型症状是「加了更多线程反而更慢」,且变量彼此独立、无锁竞争。可用 perf c2c(Linux)、VTune 等工具定位发生行争用的地址。
核心思路是让被不同线程高频写的变量落在不同缓存行:手工在结构体字段间插入填充字节;使用语言设施,如 Java 的 @jdk.internal.vm.annotation.Contended 注解、C++ 的 alignas(64) 与 std::hardware_destructive_interference_size;或改为线程本地累加、最后汇总的设计,从根上消除共享写。
无锁队列、计数器数组、高性能框架(如 LMAX Disruptor)的实现中,防伪共享填充是标准手法。

登录 后参与讨论
暂无讨论,来发表第一条评论吧