一、什么时候用
你的多线程程序性能不随核心数线性提升,怀疑是伪共享(False Sharing)。
# 记录缓存行冲突
perf c2c record -F 99 ./my_program
# 查看报告
perf c2c report --stdio
# 输出示例:
# =================================================
# Shared Data Cache Line Table
# =================================================
# Total records : 12345
# Load records : 8123
# Store records : 4222
#
# Offset Node PA Snoop Cacheline
# 0x100 0 0x7f1234 HitM 0x7f1234
# ↑ 这里有大量缓存行在核心间乒乓
对应代码中的伪共享:
struct Data {
int a; // 线程 1 频繁写
int b; // 线程 2 频繁写
// a 和 b 在同一缓存行(64 字节),导致 RFO 在核心间乒乓
};
// 修复:用 alignas(64) 分开到不同缓存行
struct alignas(64) Data1 { int a; };
struct alignas(64) Data2 { int b; };