伪共享 false sharing
更新时间:2026-10-01。是并发代码里最反直觉的性能问题之一,呼应缓存与性能主线。
一、机制
缓存一致性以缓存行为单位;线程 A 写同一行里的 x,会让线程 B 核上的该行(即使它只关心 y)失效并重新加载,看似独立却串行化。

二、定位与修复
perf c2c/缓存事件显示同一行跨核写;修复:struct alignas(64) Counter {...}; 或加填充,把高频写字段隔离。只读同享没问题,写少也不必过度对齐。
常见坑
- 计数器数组元素紧密排列,线程分元素仍伪共享。
- 缓存行大小在某些平台非 64B(用 hardware_destructive_interference_size)。
- 无脑填充浪费内存、降低密度。
小结
总结
伪共享是缓存一致性"行级连坐"造成的反直觉性能陷阱:不同核心各自写逻辑上无关的变量,但只要它们落在同一个约 64B 的缓存行里,一个核心的写就会让其他核心上的整行失效、被迫重新加载(MESI 反复 bouncing),把本可并行的写串行化、吞吐骤降,典型出现在紧密排列的计数器数组或相邻热字段;用 perf c2c 定位后,用 alignas(64) 或填充把高频写的字段隔到各自独立的缓存行即可显著提速(注意平台行长可能非 64B,且只读共享无害、无脑填充浪费内存),务必先测量再对齐。