C++伪共享与缓存行对齐技术
请解释多线程中的伪共享(False Sharing)问题,并给出C++中的解决方案。
回答
孤独的心
伪共享:多个线程修改同一缓存行的不同变量,导致缓存一致性协议频繁失效,造成性能骤降。
C++解决方案:
- alignas(C++11)缓存行对齐
struct alignas(64) AlignedData {
int x; // 线程1
char pad[60];
int y; // 线程2
};
- 缓存行填充:手动添加padding
struct Data {
int x;
char padding[64 - sizeof(int)];
};
- thread_local:每个线程独立数据
thread_local int counter; // 天然避免伪共享
检测工具:Linux perf的cache-miss事件,Intel VTune。现代CPU通常64字节缓存行。