背景
两个线程更新不同计数器,逻辑上没有共享数据,却可能争用同一缓存行。伪共享是布局问题,不是原子变量失效。
核心判断
- 先确认热点来自并发写和缓存一致性开销。
- 按写入者划分数据,必要时使用每线程计数后聚合。
- 只有测量支持时才增加对齐或 padding。
最小示例
下面保留核心逻辑;业务类型、调用入口和环境配置按项目补齐。
struct alignas(64) Counter { std::atomic<std::uint64_t> value{0}; };
struct Metrics { Counter accepted; Counter rejected; };
边界与误区
64 字节只是示例假设,不是所有硬件的保证。过度 padding 会增加工作集,读多写少的数据可能因此更慢。
验证方式
固定线程数、CPU 亲和性和操作次数,对比吞吐及缓存相关事件。保留真实业务基准,不用单一空循环决定结构布局。
小结
高频并发写字段要避免伪共享,但任何 padding 都必须由 profile 证明收益。